Пятница, 29.03.2024, 16:14
Приветствую Вас Гость

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

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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 8
  • «
  • 1
  • 2
  • 3
  • 4
  • 7
  • 8
  • »
Форум » Delphi » Создание mp3 плеера на Delphi » Как работать с плейлистом в delphi на библиотеке BASS.DLL? (разбираем работу с плейлистом на delphi)
Как работать с плейлистом в delphi на библиотеке BASS.DLL?
xaramamburuДата: Среда, 09.05.2012, 16:03 | Сообщение # 16
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF,
Замените строку:
TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index]));
на
TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + readID3Tag(Listbox1.Items[index]).Titel);
 
Filo$oFДата: Среда, 09.05.2012, 16:19 | Сообщение # 17
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
xaramamburu,
Спасибо огромное. smile
Оказывается всё так просто, а я то мучился.
Вставлял вместо "extractfilename" это readID3Tag, но не работало. Оказывается ещё нужно было вписать Titel smile

Добавлено (09.05.2012, 16:19)
---------------------------------------------
Только если символов в названии меньше 30, то пустые заменятся на некрасивые чёрточки...

 
xaramamburuДата: Среда, 09.05.2012, 16:30 | Сообщение # 18
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF,
у меня вроде отображается все нормально.
 
Filo$oFДата: Пятница, 11.05.2012, 22:02 | Сообщение # 19
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
Не знаю, как залить картинку. Но видимо читается по 30 байт и если есть не занятые байты, то они заменяются этими чёрточками. Странно..
Если просто выводить теги через
Code
WITH readID3Tag(Listbox1.Items.Strings[i]) do  
ListBox1.Items.Add(Titel + ' - ' +Artist);


То всё нормально выводит. Хм.

Добавлено (11.05.2012, 22:02)
---------------------------------------------
xaramamburu
Здравствуйте.
Вот нашёл хороший компонент чтения тегов http://www.programmersforum.ru/showpost.php?p=398783&postcount=6
Всё работает, но я снова к вам за советом. Опять не выходит вывести теги в плейлист...
Извините за беспокойство. Это последний раз. Просто плеер мой почти готов, но не как не могу разобраться с тегами.
Отрисовка та же.

 
xaramamburuДата: Суббота, 12.05.2012, 21:32 | Сообщение # 20
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF,
Создайте функцию
function Tform2.readID3Tag(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});
//получаем тег Title
Result:=ChannelGetTagTitle(Channel1);
//освобаждаем канал
BASS_StreamFree(Channel1);
end;

Ну и в отрисовке вызывайте:
TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + readID3Tag(Listbox1.Items[index]));

Т.е. аналогично получению времени проигрывания песни. Если подумать то эти функции можно объединить в одну (получать сразу и время и нужный тег...
 
Filo$oFДата: Четверг, 17.05.2012, 19:17 | Сообщение # 21
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
А как треки из ListBox сохранять *.m3u ?
 
xaramamburuДата: Четверг, 17.05.2012, 21:48 | Сообщение # 22
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF,

Вот пример сохранения треков из ListBox в файл плейлиста формата M3U:

Code

[b]// вызов диалога сохранения[/b]
procedure TForm_player.Button6Click(Sender: TObject);
begin
     if SaveDialog1.Execute then
     begin
     if ExtractFileExt(SaveDialog1.FileName) = '.m3u' then
     SaveList(SaveDialog1.FileName) else SaveList(SaveDialog1.FileName + '.m3u');
     end;
end;

function TForm_player.MinToSec(tim: string): string;
[b]//переводим минуты в секунды[/b]
var n: integer;
     a: string;
begin
     n := 1;
     a := '';
     repeat
     a := a + tim[n];
     Inc(n);
     until tim[n] = ':';
     Delete(tim, 1, Length(a) + 1);
     result := IntToStr((StrToInt(a) * 60) + StrToInt(tim));
end;

procedure TForm_player.SaveList(SaveFile: string);
[b]//сохранение[/b]
var List: TStringList;
     i: integer;
     s: string;
     F:TextFile;
begin
Assignfile(F,SaveFile);
Rewrite(F);
Writeln(F,'#EXTM3U');
     for i := 0 to ListBox1.Items.Count - 1 do
     begin
     s:='';
     s:=copy(lentime(Listbox1.Items[i]),4,5);
     Writeln(F,'#EXTINF:' + MinToSec(s)+ ',' +readID3Tag(Listbox1.Items[i]));
     Writeln(F,ListBox1.Items.Strings[i]);
     end;
Closefile(F);
end;


lentime(Listbox1.Items[i]) - функция получения времени проигрывания.
readID3Tag(Listbox1.Items[i]) -функция получения тега Title.

Описание функций смотрите выше на форуме.

Переделано с сайта http://delphisources.at.ua/publ....-0-591#
 
MuLtLaNdIaДата: Пятница, 18.05.2012, 19:41 | Сообщение # 23
Рядовой
Группа: Пользователи
Сообщений: 12
Репутация: 0
Статус: Offline
xaramamburu
Когда добавляю функцию "readID3Tag" то ругается:
Undeclared identifier: 'TID3Tag'

а из-за неё не могу проверить функцию сохранения плейлиста sad
 
Filo$oFДата: Пятница, 18.05.2012, 19:58 | Сообщение # 24
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
MuLtLaNdIa,
Замените эту строку
Code
    Writeln(F,'#EXTINF:' + MinToSec(s)+ ',' +readID3Tag(Listbox1.Items[i]));


Просто на
Code
Writeln(F,'#EXTINF:' + MinToSec(s))


Я проверил, работает.
Эта функция читает теги из mp3. И если она у вас не реализована, то и в плейлисте думаю ей быть незачем smile
Подробнее о ней здесь http://www.programmersforum.ru/showpost.php?p=398783&postcount=6
 
MuLtLaNdIaДата: Пятница, 18.05.2012, 22:36 | Сообщение # 25
Рядовой
Группа: Пользователи
Сообщений: 12
Репутация: 0
Статус: Offline
Filo$oF
Благодарю, Всё прекрасно работает smile
 
Filo$oFДата: Среда, 23.05.2012, 15:11 | Сообщение # 26
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
xaramamburu

Здравствуйте smile
Помогите вновь разобраться с тегами. Нашёл библиотеку читающую теги из большенства форматов. Но как всегда не выходит вывести в отрисовку.
Пробовал создать процедуру но вышла какая-то ерунда. Запускается, но теги не выводит.
Пытался так:

Code
function Tform_player.readID3Tag(FileName1: string): string;
  var
  Channel1 : DWORD;
    str, e: string;
   GT: GetTag;
   tmp: array[0..13] of WideString;
   i, t: integer;
   Lyr: WideString;
  begin
  //освобаждаем канал
  BASS_StreamFree(Channel1);
  //пытаемся загрузить файл и получить дескриптор канала
  Channel1 := BASS_StreamCreateFile(FALSE, PChar(FileName1), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
   if str = '' then exit;
   Gt := gtArtist;
   Result:= ZuBy_GetTags(str, GT);
   e := ExtractFileExt(str);
   ZuBy_GetFullInfo(str, e, tmp);
   if Pos('aac', e) > 0 then t := 12;
   if Pos('ac3', e) > 0 then t := 4;
   if (Pos('mac', e) > 0) or (Pos('ape', e) > 0) then t := 11;
   if (Pos('flac', e) > 0) or (Pos('fla', e) > 0) then t := 13;
   if (Pos('mp3', e) > 0) or (Pos('mp2', e) > 0) then t := 5;
   if (Pos('mp+', e) > 0) or (Pos('mpc', e) > 0) or (Pos('mpp', e) > 0) then t := 12;
   if (Pos('ogg', e) > 0) or (Pos('oga', e) > 0) then t := 5;
   if (Pos('ofr', e) > 0) or (Pos('ofs', e) > 0) then t := 13;
   if Pos('spx', e) > 0 then t := 6;
   if Pos('tta', e) > 0 then t := 5;
   if Pos('wav', e) > 0 then t := 4;
   if Pos('wv', e) > 0 then t := 6;
   if Pos('wma', e) > 0 then t := 5;
   BASS_StreamFree(Channel1);
  end;


Выводил так

Code
TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + readID3Tag(Listbox1.Items[index]));


Сама библиотека с демо здесь:

http://narod.ru/disk/50016427001.41ba1827c3e03d3a3f3f43963c784b6d/ZuBy.rar.html

Я знаю, что сильно наглею, но надеюсь на помощь smile

Добавлено (23.05.2012, 14:33)
---------------------------------------------
Уже разобрался и без этой библиотеки smile

Добавлено (23.05.2012, 15:11)
---------------------------------------------
Теперь возник другой вопрос, при draganddrop в плейлист добавляются только файлы формата mp3. Как прописать фильтр, чтобы добавлялись так же ogg ?
Пробовал так

Code
if lowercase(ExtractFileExt(StrPas(filename)))='.mp3|.ogg' then


Но не работает.
 
xaramamburuДата: Среда, 23.05.2012, 16:28 | Сообщение # 27
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF,

Code

if (lowercase(ExtractFileExt(StrPas(filename)))='.mp3')  or  (lowercase(ExtractFileExt(StrPas(filename)))='.ogg') then

smile
 
Filo$oFДата: Суббота, 26.05.2012, 00:31 | Сообщение # 28
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
xaramamburu,

Благодарю smile

Добавлено (26.05.2012, 00:31)
---------------------------------------------
Подскажите,

Создаю динамически TabSheet и listbox на нём

Code

var
   List: array of TListbox;
   TS: array of TTabSheet;

procedure TForm1.Button2Click(Sender: TObject);
begin
   SetLength(TS, Length(TS) + 1);
   TS[High(TS)] := TTabSheet.Create(PageControl1);
   TS[High(TS)].PageControl := PageControl1;
   TS[High(TS)].Caption := 'Вкладка номер: ' + IntToStr(High(TS) + 1);
   SetLength(List, Length(List) + 1);
   List[High(List)] := TListBox.Create(TS[High(TS)]);
   List[High(List)].Parent := TS[High(TS)];
   List[High(List)].Align := alClient;
end;


Но, как применить к динамическим listboxam отрисовку не соображу.
Пробовал создать процедуру:

Code

procedure TForm1.DrawItem(Control: TWinControl; Index: Integer;
   Rect: TRect; State: TOwnerDrawState);
   begin
  with (control as tlistbox).canvas do
begin
  if (State = [odFocused, odSelected]) or (State = [odSelected]) then
  begin
Font.Name := 'Capture it';
  Font.Size := 8;
  Brush.Style := bsClear;
  (control as tlistbox).ItemHeight := 30;
  SetBkMode((control as tlistbox).canvas.Handle, TRANSPARENT);
TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. [' + readID3TagArtist((control as tlistbox).Items[index])+ '] - ['+readID3Tag((control as tlistbox).Items[index])+ ']');//для названия песни
  TextOut(rect.right-57, rect.top+15, lentime((control as tlistbox).Items[index]));//для времени
  TextOut(Rect.Left + w, Rect.Top+15,  '.:: ' + GetKbps((control as tlistbox).Items[index])+ ' kpbs :: ' + readID3TagYear((control as tlistbox).Items[index])+ ' :: ' +ExtractFileExt((control as tlistbox).Items[index]) + ' ::.');
   end
  else
  begin
  Font.Name := 'Capture it';
  Font.Color := clGray;
  Brush.Style := bsClear;
  Font.Size := 8;
  SetBkMode((control as tlistbox).canvas.Handle, TRANSPARENT);
  TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. [' + readID3TagArtist((control as tlistbox).Items[index])+ '] - ['+readID3Tag((control as tlistbox).Items[index])+ ']');//для названия песни
  TextOut(rect.right-57, rect.top+15, lentime((control as tlistbox).Items[index]));//для времени
  TextOut(Rect.Left + w, Rect.Top+15,  '.:: ' + GetKbps((control as tlistbox).Items[index])+ ' kpbs :: ' + readID3TagYear((control as tlistbox).Items[index])+ ' :: ' + ExtractFileExt((control as tlistbox).Items[index])+ ' ::.');
  end;
  end;
  end;

end;


А после приписывал в первом коде

Code
  List[High(List)].onDrawItem := DrawItem;


Но, не работает. Что тут не так?
 
xaramamburuДата: Понедельник, 28.05.2012, 08:14 | Сообщение # 29
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Filo$oF,
Выкладывайте ссылку на весь код, так как, чтобы проверить работоспособность и вам помочь, этот фрагмент нужно куда то вставить???
 
Filo$oFДата: Понедельник, 28.05.2012, 09:07 | Сообщение # 30
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: Offline
xaramamburu,
Это весь код. smile
Я его пробовал на оттдельной форме.

Вот:
Code
unit Unit1;
     
interface

uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ComCtrls;

type
    TForm1 = class(TForm)
      PageControl1: TPageControl;
      TabSheet1: TTabSheet;
      Button2: TButton;
      procedure Button2Click(Sender: TObject);
      procedure DrawItem(Control: TWinControl; Index: Integer;
    Rect: TRect; State: TOwnerDrawState);
    private

    public

    end;
     
var
    Form1: TForm1;
    List: array of TListbox;
    TS: array of TTabSheet;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
    SetLength(TS, Length(TS) + 1);
    TS[High(TS)] := TTabSheet.Create(PageControl1);
    TS[High(TS)].PageControl := PageControl1;
    TS[High(TS)].Caption := 'Вкладка номер: ' + IntToStr(High(TS) + 1);
    SetLength(List, Length(List) + 1);
    List[High(List)] := TListBox.Create(TS[High(TS)]);
    List[High(List)].Parent := TS[High(TS)];
    List[High(List)].Align := alClient;
    List[High(List)].onDrawItem := DrawItem;

end;

procedure TForm1.DrawItem(Control: TWinControl; Index: Integer;
    Rect: TRect; State: TOwnerDrawState);
    begin
   with (control as tlistbox).canvas do
begin
   if (State = [odFocused, odSelected]) or (State = [odSelected]) then
   begin
Font.Name := 'Capture it';
   Font.Size := 8;
   Brush.Style := bsClear;
   (control as tlistbox).ItemHeight := 30;
   SetBkMode((control as tlistbox).canvas.Handle, TRANSPARENT);
   end
   else
   begin
   Font.Name := 'Capture it';
   Font.Color := clGray;
   Brush.Style := bsClear;
   Font.Size := 8;
   SetBkMode((control as tlistbox).canvas.Handle, TRANSPARENT);
   end;
   end;
   end;

end.


Или вот:
http://narod.ru/disk/50783401001.4a76e336ad8a750ad1631e17fbf2559b/%D0%94%D0%B8%D0%BD%D0%B0%D0%BC


Сообщение отредактировал Filo$oF - Понедельник, 28.05.2012, 09:12
 
Форум » Delphi » Создание mp3 плеера на Delphi » Как работать с плейлистом в delphi на библиотеке BASS.DLL? (разбираем работу с плейлистом на delphi)
  • Страница 2 из 8
  • «
  • 1
  • 2
  • 3
  • 4
  • 7
  • 8
  • »
Поиск:


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