Как работать с плейлистом в delphi на библиотеке BASS.DLL?
|
|
SpySpook | Дата: Вторник, 17.01.2012, 22:31 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 4
Статус: Offline
| Подскажите возможна ли сделать в плеере чтение плейлиста формата M3U?
|
|
| |
xaramamburu | Дата: Среда, 18.01.2012, 15:33 | Сообщение # 2 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Плейлист формата M3U - это обычный текстовый файл. Например такой: #EXTM3U #EXTINF:103,01 - Wake D:\музыка\8 Linkin Park\01 - Wake.mp3 #EXTINF:191,02 - Given Up D:\музыка\8 Linkin Park\02 - Given Up.mp3 #EXTINF:211,03 - Leave Out All The Rest D:\музыка\8 Linkin Park\03 - Leave Out All The Rest.mp3 #EXTINF:166,04 - Bleed It Out D:\музыка\8 Linkin Park\04 - Bleed It Out.mp3
Остается только проанализировать его содержание и выбросить лишнее. В интернете куча вариантов анализа этого файла, например для mp3 плеера выложенного в уроках на сайте подойдет такой вариант анализа этого файла:
procedure TForm1.Button1Click(Sender: TObject); var i: integer; p: integer; SL: TStringList; begin if OpenDialog1.Execute then begin SL := TStringList.Create; try SL.LoadFromFile(OpenDialog1.FileName); for i := 0 to SL.Count - 1 do begin if (Pos('#EXTM3U', SL[i]) > 0) then Continue else begin p := pos('#EXTINF', SL[i]); if p > 0 then p := Pos(',', SL[i]) + 1; if byte(p > 0)= 0 then ListBox1.AddItem(Copy(SL[i], p, length(SL[i])), nil); end; end;
finally SL.Destroy; end; end; end;
Данная процедура осуществляет загрузку полных путей к файлам в ListBox1 из плейлиста в формате M3U.
|
|
| |
SpySpook | Дата: Четверг, 19.01.2012, 13:17 | Сообщение # 3 |
Рядовой
Группа: Пользователи
Сообщений: 4
Статус: Offline
| нее это я уже сделал я не могу сделать чтоб файлы с плейлиста проигрывались программа загружает плейлист в Listbox и там показывает полный путь до файла но когда пытаюсь воспроизвести выдает ошибку что файл не найден плеер все тот же))))))))))
|
|
| |
xaramamburu | Дата: Четверг, 19.01.2012, 15:13 | Сообщение # 4 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Чтобы понять причину нужно видеть ваш код выбора песни из плейлиста, сам плейлист и то, что загружается в ListBox. Скиньте мне код и ваш плейлист или выложите фрагменты кода, посмотрим.)))
|
|
| |
SpySpook | Дата: Четверг, 19.01.2012, 22:26 | Сообщение # 5 |
Рядовой
Группа: Пользователи
Сообщений: 4
Статус: Offline
| воть это))))
procedure TForm_player.Image8Click(Sender: TObject); var j: integer; begin OpenDialog1.Title := 'Open Files'; //проверяем если PlayList не пустой то запоминаем номер текущей песни //иначе устанавливаем номер песни 0 (первая позиция в PlayList) if Form_player.listbox1.Count<>0 then i:=Form_player.ListBox1.ItemIndex else i:=0; //Диалог открытия файла if not OpenDialog1.Execute then exit; begin for j:=0 to OpenDialog1.Files.Count-1 do begin //заполняем PlayList Form_player.ListBox1.Items.Add(extractfilename(OpenDialog1.Files.Strings[j])); end; end; //запоминаем имя файла текущей песни в плейлисте Filename:=Form_player.ListBox1.Items.Strings[i]; //Выделяем эту песню в PlayList Form_player.ListBox1.ItemIndex:=i; end;
только тут без кода чтения )))) пробовал ваш код добавлять тоже самое происходит)))))Добавлено (19.01.2012, 22:26) --------------------------------------------- могу выложить весь код))))
|
|
| |
xaramamburu | Дата: Четверг, 19.01.2012, 23:44 | Сообщение # 6 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| В строке Form_player.ListBox1.Items.Add(extractfilename(OpenDialog1.Files.Strings[j])); уберите extractfilename, она отрезает путь к файлу и оставляет только имя файла с расширением. Если вы хотите, чтобы выводились только имена файлов, необходимо создать два ListBox, в один загружать имена файлов, а в другой полный путь к файлу в месте с именем и сделать его скрытым. Посмотрите уроки по видеоплееру там как раз так и сделано.)))
|
|
| |
Filo$oF | Дата: Суббота, 05.05.2012, 17:26 | Сообщение # 7 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu, Для переключения песен кнопками использую вот этот код, который вы давали в комментариях. Code procedure TForm_player.BitBtn5Click(Sender: TObject); begin if i<Form2.ListBox1.Items.Count-1 then begin dec(i); Filename:=Form2.ListBox1.Items.Strings[i]; Form2.ListBox1.ItemIndex:=i; mode:=stop; player; end else exit; end;
Но, если выделена первая песня то при нажатии кнопки вылетает ошибка и выделяется эта строка Code Filename:=Form2.ListBox1.Items.Strings[i];
Что сделать, что бы этого не происходило... ума не приложу... Помогите..
|
|
| |
xaramamburu | Дата: Суббота, 05.05.2012, 17:39 | Сообщение # 8 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Filo$oF, это код был для выбора следующей песни, поэтому проверка происходит на окончание плейлиста. Измените, чтобы проверялось начало плейлиста if i>0 then и т.д.))))
|
|
| |
Filo$oF | Дата: Воскресенье, 06.05.2012, 21:17 | Сообщение # 9 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu Надеюсь я вам ещё не надоел, но вот опять возник вопрос... Мне удалось при помощи отрисовки, добиться, что бы вместо полного адреса выводилось название файла. Но вот вывести туда длину файла не входит. Можете что нибудь посоветовать? Для отрисовки пользуюсь этим кодом:
Code Procedure TForm2.PaintImage(List1 :TListBox; Control: TWinControl; Index: Integer; Rect: TRect); const W = 16; H = 16; var BMPRect: TRect; begin with (Control as TListBox).Canvas do begin FillRect(Rect); Listbox1.Canvas.Draw(0, Rect.Top, Image2.Picture.Graphic); BMPRect := Bounds(Rect.Left, Rect.Top, W, H); end; with (control as TListBox).canvas do begin Font.Color := clGray; Font.Size := 9; Brush.Style := bsClear; Brush.Color := clGray; SetBkMode(ListBox1.canvas.Handle, TRANSPARENT); TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index], )); end; begin FillRect(Rect); List1.Canvas.Draw(0, Rect.Top, Image1.Picture.Graphic); BMPRect := Bounds(Rect.Left, Rect.Top, W, H); end;
end;
Добавлено (06.05.2012, 21:17) --------------------------------------------- Упс. Немного не верно выложил код. Вот верный: Quote Procedure TForm2.PaintImage(List1 :TListBox; Control: TWinControl; Index: Integer; Rect: TRect); const W = 16; H = 16; var BMPRect: TRect; begin with (Control as TListBox).Canvas do begin FillRect(Rect); Listbox1.Canvas.Draw(0, Rect.Top, Image2.Picture.Graphic); BMPRect := Bounds(Rect.Left, Rect.Top, W, H); end; with (control as TListBox).canvas do begin Font.Color := clGray; Font.Size := 9; Brush.Style := bsClear; Brush.Color := clGray; SetBkMode(ListBox1.canvas.Handle, TRANSPARENT); TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index] ));
end;
end;
|
|
| |
xaramamburu | Дата: Понедельник, 07.05.2012, 15:39 | Сообщение # 10 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Filo$oF, можно например так: Создаете функцию вычисления времени проигрывания файла. Code function Tform1.lentime(filename1:string):string; var Channel1 : DWORD; begin //освобаждаем канал BASS_StreamFree(Channel1); //пытаемся загрузить файл и получить дескриптор канала Channel1 := BASS_StreamCreateFile(FALSE, PChar(FileName1), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); //получаем время воспроизведения Lentime:=FormatDateTime('hh:mm:ss',BASS_ChannelBytes2Seconds(Channel1,BASS_ChannelGetLength(Channel1,BASS_POS_BYTE))/(24 * 3600)); //освобаждаем канал BASS_StreamFree(Channel1); end;
А затем в отрисовке добавляем:
TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index]));//для названия песни TextOut(rect.right-50, rect.top, lentime(Listbox1.Items[index]));//для времени
Думаю, как то так.))))
|
|
| |
Filo$oF | Дата: Понедельник, 07.05.2012, 20:00 | Сообщение # 11 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu, Ругается на lintime в отрисовке...
|
|
| |
xaramamburu | Дата: Понедельник, 07.05.2012, 20:35 | Сообщение # 12 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Filo$oF, Когда ругается, нужно приводить код ошибки, а то не понятно как ругается. Далее не lintime, а lentime. И еще, важно где вы прописали саму функцию, в модуле с программой или в модуле с плейлистом от этого зависит как вы к ней будете обращаться. Но в любом случае ее нужно прописать в разделе Type : function lentime(filename1:string):string;
|
|
| |
Filo$oF | Дата: Понедельник, 07.05.2012, 21:33 | Сообщение # 13 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu, Извините, заработало. Спасибо.Добавлено (07.05.2012, 21:33) --------------------------------------------- xaramamburu,
Не совсем правильно заработало. Время выводилось с лишними секундами. Но я решил проблему вот так: Code function Tform_player.lentime(filename1:string):string; var TrackLen: Double; ValLen: Double; Channel1 : DWORD; begin //освобаждаем канал BASS_StreamFree(Channel1); //пытаемся загрузить файл и получить дескриптор канала Channel1 := BASS_StreamCreateFile(FALSE, PChar(FileName1), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); //получаем время воспроизведения TrackLen:=BASS_ChannelBytes2Seconds(Channel1,BASS_ChannelGetLength(Channel1,BASS_POS_BYTE)); ValLen:=TrackLen / (24 * 3600); Lentime:=FormatDateTime('hh:mm:ss',ValLen); //освобаждаем канал BASS_StreamFree(Channel1); end;
|
|
| |
xaramamburu | Дата: Понедельник, 07.05.2012, 22:13 | Сообщение # 14 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Filo$oF, Спасибо, не заметил. Уже исправил.
|
|
| |
Filo$oF | Дата: Вторник, 08.05.2012, 23:05 | Сообщение # 15 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu, Я снова к вам Облазил весь поисковик, но так и не нашёл ничего дельного. В общем, проблема такова:
Я вытаскиваю ID3 тег из файла путём даблклика по нужной строке в Listbox
Code function readID3Tag(FileName: string): TID3Tag; var FS: TFileStream; Buffer: array [1..128] of Char; begin FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try FS.Seek(-128, soFromEnd); FS.Read(Buffer, 128); with Result do begin ID := Copy(Buffer, 1, 3); Titel := Copy(Buffer, 4, 30); Artist := Copy(Buffer, 34, 30); Album := Copy(Buffer, 64, 30); Year := Copy(Buffer, 94, 4); Comment := Copy(Buffer, 98, 30); Genre := Ord(Buffer[128]); end; finally FS.Free; end; end;
и
Code procedure TForm2.ListBox1DblClick(Sender: TObject); begin i:=ListBox1.Itemindex; Filename:=ListBox1.Items.Strings[i]; mode:=stop; form_player.player; form_player.Checkbox7.Checked := False; Form_player.SetFocus; Form7.Visible:=True; begin WITH readID3Tag(Listbox1.Items.Strings[i]) do begin Form_player.Label4.Caption := 'ID: ' + ID; Form_player.Label5.Caption := 'Titel: ' + Titel; Form_player.Label6.Caption := 'Artist: ' + Artist; Form_player.Label7.Caption := 'Album: ' + Album; Form_player.Label8.Caption := 'Year: ' + Year; Form_player.Label9.Caption := 'Comment: ' + Comment; IF (Genre >= 0) AND (Genre <=146) then Form_player.Label10.Caption := 'Genre: ' + Genres[Genre] else Form_player.Label11.Caption := 'N/A'; end; end; end;
Хочу вывести вместо названия файла в listbox исполнителя и название песни, то есть чтобы вместо "олвжфвато.mp3" отображалось "Исполнитель- название песни". А как это сделать не пойму...
|
|
| |
|