Воскресенье, 22.10.2017, 05:38
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 812378»
Форум » Delphi » Создание mp3 плеера на Delphi » Как работать с плейлистом в delphi на библиотеке BASS.DLL? (разбираем работу с плейлистом на delphi)
Как работать с плейлистом в delphi на библиотеке BASS.DLL?
SpySpookДата: Вторник, 17.01.2012, 22:31 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
Подскажите возможна ли сделать в плеере чтение плейлиста формата M3U?
 
xaramamburuДата: Среда, 18.01.2012, 15:33 | Сообщение # 2
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: 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.
smile
 
SpySpookДата: Четверг, 19.01.2012, 13:17 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
нее это я уже сделал я не могу сделать чтоб файлы с плейлиста проигрывались программа загружает плейлист в Listbox и там показывает полный путь до файла но когда пытаюсь воспроизвести выдает ошибку что файл не найден плеер все тот же))))))))))
 
xaramamburuДата: Четверг, 19.01.2012, 15:13 | Сообщение # 4
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Чтобы понять причину нужно видеть ваш код выбора песни из плейлиста, сам плейлист и то, что загружается в ListBox. Скиньте мне код и ваш плейлист или выложите фрагменты кода, посмотрим.)))
 
SpySpookДата: Четверг, 19.01.2012, 22:26 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: 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
Репутация: 26
Статус: Offline
В строке Form_player.ListBox1.Items.Add(extractfilename(OpenDialog1.Files.Strings[j])); уберите extractfilename, она отрезает путь к файлу и оставляет только имя файла с расширением. Если вы хотите, чтобы выводились только имена файлов, необходимо создать два ListBox, в один загружать имена файлов, а в другой полный путь к файлу в месте с именем и сделать его скрытым. Посмотрите уроки по видеоплееру там как раз так и сделано.)))
 
Filo$oFДата: Суббота, 05.05.2012, 17:26 | Сообщение # 7
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: 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
Репутация: 26
Статус: Offline
Filo$oF, это код был для выбора следующей песни, поэтому проверка происходит на окончание плейлиста. Измените, чтобы проверялось начало плейлиста if i>0 then и т.д.))))
 
Filo$oFДата: Воскресенье, 06.05.2012, 21:17 | Сообщение # 9
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
xaramamburu
Надеюсь я вам ещё не надоел, но вот опять возник вопрос...
Мне удалось при помощи отрисовки, добиться, что бы вместо полного адреса выводилось название файла. Но вот вывести туда длину файла не входит. cry
Можете что нибудь посоветовать?
Для отрисовки пользуюсь этим кодом:

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
Репутация: 26
Статус: 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
Репутация: 2
Статус: Offline
xaramamburu,
Ругается на lintime в отрисовке...
 
xaramamburuДата: Понедельник, 07.05.2012, 20:35 | Сообщение # 12
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF,
Когда ругается, нужно приводить код ошибки, а то не понятно как ругается. Далее не lintime, а lentime. И еще, важно где вы прописали саму функцию, в модуле с программой или в модуле с плейлистом от этого зависит как вы к ней будете обращаться. Но в любом случае ее нужно прописать в разделе Type :
function lentime(filename1:string):string;
 
Filo$oFДата: Понедельник, 07.05.2012, 21:33 | Сообщение # 13
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: 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;


smile
 
xaramamburuДата: Понедельник, 07.05.2012, 22:13 | Сообщение # 14
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF,
Спасибо, не заметил. Уже исправил.
 
Filo$oFДата: Вторник, 08.05.2012, 23:05 | Сообщение # 15
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
xaramamburu,
Я снова к вам smile
Облазил весь поисковик, но так и не нашёл ничего дельного. В общем, проблема такова:

Я вытаскиваю 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" отображалось "Исполнитель- название песни". А как это сделать не пойму...
 
Форум » Delphi » Создание mp3 плеера на Delphi » Как работать с плейлистом в delphi на библиотеке BASS.DLL? (разбираем работу с плейлистом на delphi)
Страница 1 из 812378»
Поиск:


Copyright MyCorp © 2017Конструктор сайтов - uCoz