Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MediaPlayer [D7]


aka ©   (2013-01-17 10:42:00) 

Здравствуйте, делаю задание - создание MP3 плеера. Написал рекурсивную процедуру заполнения списка проигрывания, но работает очень медленно из-за MediaPlayer.Open;


type

PMp3File = ^TMp3File;
TMp3File = record
 path: WideString;
 name: WideString;
 intLeng: Integer;
 strLeng: String[10];
end;

var
 Mp3FileList: TList;
 AMp3File: PMp3File;

procedure TMainForm.AddFolderToList(const Path: String);
var
 searchResult : TSearchRec;
begin
 if FindFirst(Path + '\*.mp3', faAnyFile, searchResult) = 0 then
 begin
   repeat
     New(AMp3File);
     AMp3File^.path := Path;
     AMp3File^.name := searchResult.Name;

     MediaPlayer.FileName := Path +'\'+ searchResult.Name;
     AMp3File^.strLeng := FormatDateTime('hh:nn:ss',(MediaPlayer.Length div 1000)/(24*60*60));

     MediaPlayer.Open;
     AMp3File^.intLeng := MediaPlayer.Length;

     ListBox.Items.Add(AMp3File^.name + ' - ' + AMp3File^.strLeng);
     Mp3FileList.Add(AMp3File);

     Application.ProcessMessages;
   until FindNext(searchResult) <> 0;
 end;

 if FindFirst(Path + '\*', faDirectory, searchResult) = 0 then
 begin
   repeat
     if(searchResult.Name <> '.') and (searchResult.Name <> '..') then
       AddFolderToList(Path + '\'+searchResult.Name);
   until FindNext(searchResult) <> 0;
 end;
end;

AddFolderToList('D:\Music');


Все дело в том, что нужно узнать время воспроизведения файла, а для этого нужно подставить плееру имя файла, открыть его и получить время.
MediaPlayer.FileName := Path +'\'+ searchResult.Name;
MediaPlayer.Open;
AMp3File^.intLeng := MediaPlayer.Length;


Но работает этот прием очень медленно.

Можно как нибудь быстрее?


aka   (2013-01-17 13:30:00) [1]


> brother ©   (17.01.13 12:43) [6]

Ну спасибо, работает быстро как молния.


procedure TMainForm.AddFolderToList(const Path: String);
var
 searchResult : TSearchRec;
 Channel: dword;
 ChanLeng: Int64;
 AllTime: Int64;
 H, M, S: Integer;
begin
 if FindFirst(Path + '\*.mp3', faAnyFile, searchResult) = 0 then
 begin
   repeat
     New(AMp3File);
     AMp3File^.path := Path;
     AMp3File^.name := searchResult.Name;

     Channel := BASS_StreamCreateFile(false, pChar(Path +'\'+ searchResult.Name), 0, 0, 0);
     ChanLeng := BASS_ChannelGetLength(Channel,BASS_POS_BYTE);
     AllTime := Trunc(BASS_ChannelBytes2Seconds(Channel, ChanLeng));

     AMp3File^.intLeng := AllTime; // second
     H := AllTime div 3600;
     M := (AllTime - H * 3600) div 60;
     S := AllTime - H * 3600 - M * 60;
     AMp3File^.strLeng := Format('%.2d:%.2d:%.2d', [H, M, S]);

     ListBox.Items.Add(AMp3File^.name + ' - ' + AMp3File^.strLeng);
     Mp3FileList.Add(AMp3File);

     Application.ProcessMessages;
   until FindNext(searchResult) <> 0;
 end;

 if FindFirst(Path + '\*', faDirectory, searchResult) = 0 then
 begin
   repeat
     if(searchResult.Name <> '.') and (searchResult.Name <> '..') then
       AddFolderToList(Path + '\'+searchResult.Name);
   until FindNext(searchResult) <> 0;
 end;
end;


brother   (2013-01-17 12:43:00) [2]

те уговорил?)


aka   (2013-01-17 12:27:00) [3]


> brother ©   (17.01.13 12:04) [4]

Ну ладно, попробую


brother   (2013-01-17 12:04:00) [4]

откажись от MediaPlayer и поробуй использовать bass.dll - все проблеммы отпадут!


Anatoly Pogoretsky   (2013-01-17 12:00:00) [5]

> Vlad  (17.01.2013 11:47:02)  [2]

Должен Феде рубль


Vlad   (2013-01-17 11:47:00) [6]


> QAZ10   (17.01.13 10:53) [1]
>
> при таком "задании" ты должен сам написать декодер,а не
> медиаплеер подсовывать

Ничего не должен.


QAZ10   (2013-01-17 10:53:00) [7]

при таком "задании" ты должен сам написать декодер,а не медиаплеер подсовывать


Наверх

Титульная страница Поиск, карта сайта Написать письмо