Как работать с плейлистом в delphi на библиотеке BASS.DLL?
|
|
xaramamburu | Дата: Среда, 09.05.2012, 16:03 | Сообщение # 16 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: 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
Статус: Offline
| xaramamburu, Спасибо огромное. Оказывается всё так просто, а я то мучился. Вставлял вместо "extractfilename" это readID3Tag, но не работало. Оказывается ещё нужно было вписать Titel Добавлено (09.05.2012, 16:19) --------------------------------------------- Только если символов в названии меньше 30, то пустые заменятся на некрасивые чёрточки...
|
|
| |
xaramamburu | Дата: Среда, 09.05.2012, 16:30 | Сообщение # 18 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Filo$oF, у меня вроде отображается все нормально.
|
|
| |
Filo$oF | Дата: Пятница, 11.05.2012, 22:02 | Сообщение # 19 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: 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
Статус: 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
Статус: Offline
| А как треки из ListBox сохранять *.m3u ?
|
|
| |
xaramamburu | Дата: Четверг, 17.05.2012, 21:48 | Сообщение # 22 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: 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
Статус: Offline
| xaramamburu Когда добавляю функцию "readID3Tag" то ругается: Undeclared identifier: 'TID3Tag'
а из-за неё не могу проверить функцию сохранения плейлиста
|
|
| |
Filo$oF | Дата: Пятница, 18.05.2012, 19:58 | Сообщение # 24 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| MuLtLaNdIa, Замените эту строку Code Writeln(F,'#EXTINF:' + MinToSec(s)+ ',' +readID3Tag(Listbox1.Items[i]));
Просто на Code Writeln(F,'#EXTINF:' + MinToSec(s))
Я проверил, работает. Эта функция читает теги из mp3. И если она у вас не реализована, то и в плейлисте думаю ей быть незачем Подробнее о ней здесь http://www.programmersforum.ru/showpost.php?p=398783&postcount=6
|
|
| |
MuLtLaNdIa | Дата: Пятница, 18.05.2012, 22:36 | Сообщение # 25 |
Рядовой
Группа: Пользователи
Сообщений: 12
Статус: Offline
| Filo$oF Благодарю, Всё прекрасно работает
|
|
| |
Filo$oF | Дата: Среда, 23.05.2012, 15:11 | Сообщение # 26 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu
Здравствуйте Помогите вновь разобраться с тегами. Нашёл библиотеку читающую теги из большенства форматов. Но как всегда не выходит вывести в отрисовку. Пробовал создать процедуру но вышла какая-то ерунда. Запускается, но теги не выводит. Пытался так:
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
Я знаю, что сильно наглею, но надеюсь на помощь Добавлено (23.05.2012, 14:33) --------------------------------------------- Уже разобрался и без этой библиотеки Добавлено (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
Статус: Offline
| Filo$oF,
Code if (lowercase(ExtractFileExt(StrPas(filename)))='.mp3') or (lowercase(ExtractFileExt(StrPas(filename)))='.ogg') then
|
|
| |
Filo$oF | Дата: Суббота, 26.05.2012, 00:31 | Сообщение # 28 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu,
Благодарю Добавлено (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
Статус: Offline
| Filo$oF, Выкладывайте ссылку на весь код, так как, чтобы проверить работоспособность и вам помочь, этот фрагмент нужно куда то вставить???
|
|
| |
Filo$oF | Дата: Понедельник, 28.05.2012, 09:07 | Сообщение # 30 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| xaramamburu, Это весь код. Я его пробовал на оттдельной форме.
Вот: 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 |
|
| |
|