![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]при таком "задании" ты должен сам написать декодер,а не медиаплеер подсовывать