全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1877
推到 Plurk!
推到 Facebook!

D7的mediaplayer如何指定播放一個資料夾內的mp3?

尚未結案
samhu
一般會員


發表:5
回覆:9
積分:2
註冊:2004-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-14 07:59:22 IP:211.76.xxx.xxx 未訂閱
使用環境:WINXP DELPHI 7 我在FORM上加入一個MEDIAPLAYER元件,但是在指定歌曲時卻只能單選一首 不能複選,如果要播放 C:\MP3\***\*.MP3(無論幾首)要如何寫CODE? 謝謝
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-14 08:43:37 IP:202.39.xxx.xxx 未訂閱
參考 "關於MediaPlayer 連續播放" 這篇: http://delphi.ktop.com.tw/topic.php?topic_Id=28749
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-14 08:45:12 IP:210.243.xxx.xxx 未訂閱
http://delphi.about.com/library/weekly/aa112800a.htm
samhu
一般會員


發表:5
回覆:9
積分:2
註冊:2004-04-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-14 17:34:11 IP:211.76.xxx.xxx 未訂閱
hahalin大大 謝謝你提供的網頁教學,不過我遇到問題如下:  
............
  FillID3TagInformation(mp3File, edTitle, edArtist, edAlbum, edYear, edGenre, edComment);      Progress.Max:=0;//這行出現[Warning] Unit1.pas(215): Symbol 'IncludeTrailingBackslash' is specific to a platform      mp3player.Close;
  mp3player.FileName:=mp3File;
  mp3player.Open;      Progress.Max := mp3player.Length;
end;    procedure TForm1.FormCreate(Sender: TObject);
begin
  txtFolder.Caption := ExtractFilePath(Application.ExeName);
  FillMP3FileList(txtFolder.Caption, mp3List.Items);
  Progress.Max:=0;
end;    procedure TForm1.ProgresTimerTimer(Sender: TObject);
begin
  if Progress.Max<>0 then
    Progress.Position := mp3player.Position;
end;
end.    {
********************************************
Zarko Gajic
About.com Guide to Delphi Programming
http://delphi.about.com
email: delphi.guide@about.com
free newsletter: http://delphi.about.com/library/blnewsletter.htm
forum: http://forums.about.com/ab-delphi/start/
********************************************
}     
作業環境:winxp pro delphi 7
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-14 17:47:44 IP:210.243.xxx.xxx 未訂閱
[Warning] Unit1.pas(215): Symbol 'IncludeTrailingBackslash' is specific to a platform 翻譯成中文的意思是IncludeTrailingBackslash會限定在特定的作業平台上 因為delphi/kylix的緣故 warning出現還是可以compile過,只是會出現這些提示資訊.
samhu
一般會員


發表:5
回覆:9
積分:2
註冊:2004-04-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-14 18:32:09 IP:211.76.xxx.xxx 未訂閱
還是無法run [Error] Unit1.pas(251): Undeclared identifier: 'Progress' 另外hagar大大提供的: 參考 "關於MediaPlayer 連續播放" 這篇: http://delphi.ktop.com.tw/topic.php?topic_Id=28749 type底下的 RandomTrack,PlayPause, FlatSystem1,RepeatAudio,FlatProgressBar1, OPen,PlayListPanel,Stop,OpenDialog1,Playlist,PlayerPanel,Back, Audio,RepeatTimer,Next這些元件怎麼都找不到?是d7沒有嗎,還是必須另外安裝? 謝謝 sorry 初學者問題特別多
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-14 18:52:27 IP:202.39.xxx.xxx 未訂閱
引言: 還是無法run [Error] Unit1.pas(251): Undeclared identifier: 'Progress' 另外hagar大大提供的: 參考 "關於MediaPlayer 連續播放" 這篇: http://delphi.ktop.com.tw/topic.php?topic_Id=28749 type底下的 RandomTrack,PlayPause, FlatSystem1,RepeatAudio,FlatProgressBar1, OPen,PlayListPanel,Stop,OpenDialog1,Playlist,PlayerPanel,Back, Audio,RepeatTimer,Next這些元件怎麼都找不到?是d7沒有嗎,還是必須另外安裝? 謝謝 sorry 初學者問題特別多
    FlatSystem1 -> 這個用不到
    PlayerPanel: TFlatPanel; -> 這些改用 TPanel
    PlayListPanel: TFlatPanel;
    PlayPause: TFlatButton; -> 這些改用 TButton
    Stop: TFlatButton;
    Next: TFlatButton;
    Back: TFlatButton;
    OPen: TFlatButton;
    RepeatTimer: TTimer; -> RepeatTimer 其實就是 TTimer
    Audio: TMediaPlayer; -> Audio 是 TMediaPlayer 元件
    Playlist: TListBox; -> PlayList 是 TListBox 元件
    FlatProgressBar1: TFlatProgressBar; -> 這以 TProgressBar 代替
    RepeatAudio: TFlatCheckBox; -> 這些改用 TCheckBox
    RandomTrack: TFlatCheckBox;
    OpenDialog1: TOpenDialog;
    Timer1: TTimer;
samhu
一般會員


發表:5
回覆:9
積分:2
註冊:2004-04-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-14 20:54:36 IP:211.76.xxx.xxx 未訂閱
hagar大大 我已經照你說的部分改好了,code如下,沒有錯誤訊息,但是OPEN鈕按下卻沒反應? 麻煩再次指導了,謝謝 unit MP3PLAYER; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls, MPlayer; type TForm1 = class(TForm) RepeatAudio: TCheckBox; RandomTrack: TCheckBox; Audio: TMediaPlayer; PlayerPanel: TPanel; PlayListPanel: TPanel; PlayPause: TButton; Stop: TButton; Next: TButton; Back: TButton; OPen: TButton; RepeatTimer: TTimer; Timer1: TTimer; Playlist: TListBox; FlatProgressBar1: TProgressBar; OpenDialog1: TOpenDialog; procedure RepeatTimerTimer(Sender: TObject); procedure PlayPauseClick(Sender: TObject); procedure NextClick(Sender: TObject); procedure OPenClick(Sender: TObject); procedure Timer1Timer(Sender: TObject); private procedure PlayAudio; procedure RandomTracks; procedure BackTrack; procedure NextTrack; procedure UpdateProgress; public { Public declarations } end; var Form1: TForm1; ss: String; implementation {$R *.dfm} procedure TForm1.PlayAudio; begin try ss := Playlist.Items.Strings[Form1.Playlist.ItemIndex]; Audio.FileName := ss; Audio.Open; Audio.Play; except; end; end; function RandomInRange(intLow, intHi : integer): integer; var itmp, iRS: integer; begin Randomize(); if intHi < intLow then begin itmp := intLow; intLow := intHi; intHi := itmp; end; iRS := intHi - intLow; Result := Trunc(iRS * Random intLow); end; procedure TForm1.RandomTracks; Var ItemCount:Integer; begin ItemCount := Playlist.Items.Count; Playlist.itemindex := RandomInRange(0,ItemCount -1); ss := Playlist.Items.Strings[Playlist.ItemIndex]; Audio.FileName := ss; Audio.Open; Audio.Play; end; procedure TForm1.NextTrack; begin try ss := Playlist.Items.Strings[Playlist.ItemIndex 1]; Playlist.itemindex := Playlist.itemindex 1; Audio.FileName := ss; Audio.Open; if Audio.FileName = '' then PlayAudio else Audio.Resume; if Playlist.itemindex = Playlist.Items.Count-1 then Playlist.itemindex := Playlist.ItemIndex 1 else except; end; end; procedure TForm1.BackTrack; begin try ss := Playlist.Items.Strings[Playlist.ItemIndex-1]; Playlist.ItemIndex := Playlist.ItemIndex - 1; Audio.FileName := ss; Audio.Open; if Audio.FileName = '' then PlayAudio else Audio.Resume; if Playlist.ItemIndex = Playlist.Items.Count-1 then Playlist.ItemIndex := Playlist.ItemIndex - 1 else except; end; end; procedure TForm1.UpdateProgress; begin try FlatProgressBar1.Max := Audio.Length; FlatProgressBar1.Position := Audio.Position; FlatProgressBar1.Update; Audio.Update; except; end; end; procedure TForm1.RepeatTimerTimer(Sender: TObject); begin try if RepeatAudio.State = cbchecked then if RandomTrack.State = cbunchecked then RandomTracks else Audio.Play; except; end; RepeatTimer.Enabled := False; end; procedure TForm1.PlayPauseClick(Sender: TObject); begin try if Audio.FileName = '' then PlayAudio else Audio.resume; except; end; end; procedure TForm1.NextClick(Sender: TObject); begin try if RandomTrack.State = cbchecked then RandomTracks else NextTrack except end; end; procedure TForm1.OPenClick(Sender: TObject); Var I: Integer; begin if OpenDialog1.Execute then for I := 0 to OpenDialog1.Files.Count-1 do with Playlist do Playlist.Items.Add(ExtractFileName(OpenDialog1.Files.Strings[i])); end; procedure TForm1.Timer1Timer(Sender: TObject); begin if Audio.FileName <> '' then UpdateProgress; end; end.
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-15 09:22:35 IP:202.39.xxx.xxx 未訂閱
做了一個陽春的範例, 參考一下: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=50132
samhu
一般會員


發表:5
回覆:9
積分:2
註冊:2004-04-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-17 08:42:38 IP:211.76.xxx.xxx 未訂閱
hagar大大 謝謝你的範例,打開資料夾並指定mp3歌曲重複播放已經可以了 但我的這個專案是一個光碟自動播放mp3的程式 我希望這程式autorun時自動(或手動按play鈕)播放 ..\mp3\***\*.mp3 (***代表不同專輯)請問該如何修改?謝謝 winxp-pro delphi7
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-05-17 09:05:09 IP:202.39.xxx.xxx 未訂閱
引言: hagar大大 謝謝你的範例,打開資料夾並指定mp3歌曲重複播放已經可以了 但我的這個專案是一個光碟自動播放mp3的程式 我希望這程式autorun時自動(或手動按play鈕)播放 ..\mp3\***\*.mp3 (***代表不同專輯)請問該如何修改?謝謝 winxp-pro delphi7
1.光碟可以 AutoRun, 要先製作 AutoRun.inf 檔, 放在光碟的根目錄 檔案內容如下(其中 xxx.Exe 指 AutoRun 時要執行的執行檔):
[autorun]
OPEN=xxx.EXE
ICON=xxx.ICO
2.AutoRun 後可以自動播放, 我想您要在 MainForm 的 OnCreate 事件中 把光碟中的 mp3 載入至 ListBox 中, 然後執行 Play 鈕的動作 3.要取得執行檔所在目錄可以用 ExtractFilePath(Application.ExeName) 或 ExtractFilePath(ParamStr(0))
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-05-19 12:55:37 IP:211.96.xxx.xxx 未訂閱
用遞迴的方法把整個光碟片所有的mp3檔案列舉出來,放到ListBox.items中,這樣就可以交付MediaPlayer做全碟播放了,底下就是這個函數
function SearchFile(Dir,fnx:String;var inList:TStringList):boolean;
var mySR : TSearchRec ;
    FileList , DirList : TStringList;
    i : integer ;
begin
   result :=false ;
   DirList:=TStringList.create;
   if findfirst(CheckTailSlash(DIR) '*.*',faAnyFile,mySR)=0 then begin
      if ((MySR.Attr and $0000003F)<=$0000003F) and (MySR.name<>'..') and (MySR.Name<>'.') THEN
         if ((MySR.Attr and $00000010)=$00000010) then
            DirList.add(CheckTailSlash(Dir) MySR.name);
      while Findnext(mySR)=0 do begin
         if ((MySR.Attr and $0000003F)<=$0000003F) and (MySR.name<>'..') and (MySR.Name<>'.') THEN
            if ((MySR.Attr and $00000010)=$00000010) then
               DirList.add(CheckTailSlash(Dir) MySR.name);
         if  ((MySR.Attr and $00000010)<>$00000010)AND((MySR.Attr and $00000002)<> $00000002)  then 
              if (pos(fnx,checktailslash(dir) MySR.Name)>0) then
                 inList.add(CheckTailSlash(Dir) MySR.name);
      end ;
   end ;
   if (DirList.Count>0) then
      for i := 1 to DirList.count do begin
         SearchFile(DirList[i-1],fnx,inList);
      end;
   FindClose(mySR);
   DirList.free;
   result :=true ;
end ;
你的程式只要加一行 Searchfile('..\mp3\','.mp3',ListBox1.items); 就可以看到你的ListBox1已經把你所有光碟里的曲目全給列舉出來了,不管有多少層,不管有多複雜,全部ok 藏私の禁止
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-05-19 12:59:08 IP:211.96.xxx.xxx 未訂閱
把上面例子中的checktailslash改成IncludeTrailingBackslash ................我都忘了改掉了 藏私の禁止
samhu
一般會員


發表:5
回覆:9
積分:2
註冊:2004-04-24

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-05-20 08:53:21 IP:211.76.xxx.xxx 未訂閱
謝謝japhenchen提供的範例,我試看看d7能不能run 另外hagar大大提供的 '用 ExtractFilePath(Application.ExeName) 或 ExtractFilePath(ParamStr(0))'的方法我也試試看,謝謝兩位
系統時間:2024-05-06 13:12:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!