Разное
|
|
xaramamburu | Дата: Понедельник, 19.08.2013, 18:09 | Сообщение # 1 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Обсуждаем различные вопросы, связанные с созданием MP3 плеера в Delphi. Пишем сюда, если только нет смысла создавать новую тему.)))
|
|
| |
Praying | Дата: Понедельник, 19.08.2013, 18:10 | Сообщение # 2 |
Сержант
Группа: Пользователи
Сообщений: 20
Статус: Offline
| Я задался вопросом, по поводу эквалайзера, "Как удалить деления". Много гуглил по этому поводу, везде ответ, что нужно увеличить максимальное количество делений. Попробовал на практике, деления слились в полосы (от 0 до 200 поставил), стало выглядеть более менее. Но возникли другие вопросы. Не повлияют ли такие действия на эффективность вычисления частот? И как среди такого числа позиций, найти золотую середину, при попытке вернуться к настройкам по умолчанию. Так сказать, сделать кнопку которая бы сбрасывала настройки эквалайзера на стандартные(на середину заданную в Position)?
|
|
| |
xaramamburu | Дата: Понедельник, 19.08.2013, 18:10 | Сообщение # 3 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| raying, Цитата Я задался вопросом, по поводу эквалайзера, "Как удалить деления". У TrackBar есть свойство TickStyle поставьте tsNone и делений не будет. Максимальное число делений увеличивать нет смысла. Оно влияет на параметр p.fgain из структуры типа BASS_DX8_PARAMEQ и задает усиление. Этот параметр может изменяться от-15 до 15 согласно справке по bass. Поэтому исправьте у себя, у вас для TrackBar стоит Min=0, Max=20, а Position=10, а должно быть Min=0, Max=30, а Position=15. Отсюда и число 15 в настройках эквалайзера p.fGain :=15-trackbar3.Position; //усиление.
Цитата И как среди такого числа позиций, найти золотую середину, при попытке вернуться к настройкам по умолчанию. Так сказать, сделать кнопку которая бы сбрасывала настройки эквалайзера на стандартные(на середину заданную в Position)? Ну здесь все просто, нужно сбрасывать все TrackBar'ы эквалайзера при нажатии на кнопку в позицию 15, что соответствует 0 усилению:
TrackBar3.position:=15; TrackBar4.position:=15; ----------------------------- и т.д. Скажу больше, вы можете сделать как во всех крутых плеерах стандартные настройки Рок, Поп, Джаз и т.д. Для этого создайте соответствующие кнопки и повесьте на них код, который бы устанавливал TrackBar'ы в нужные вам позиции. Понятно, что для каждой кнопки их нужно будет подобрать на слух или покопаться в интернете, может, что то и найдете.)))))
|
|
| |
Praying | Дата: Понедельник, 19.08.2013, 18:10 | Сообщение # 4 |
Сержант
Группа: Пользователи
Сообщений: 20
Статус: Offline
| Очередной раз спасибо) Очень помогло) Вопрос по части отрисовки, можно ли как нибудь убрать вывод в плейлисте, формата? Чтобы было только название, без расширения. Я разделяю треки текстовым документом, и поэтому, формат мешается) И возможно ли сделать кнопку которая бы создавала текстовый документ уже с заданным по умолчанию названием и автоматически добавляла его в плейлист?
Сообщение отредактировал Praying - Вторник, 13.08.2013, 21:16 |
|
| |
xaramamburu | Дата: Понедельник, 19.08.2013, 18:10 | Сообщение # 5 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Praying, Будет что то типа этого:
if length(extractfilename(Listbox1.Items[index]))>45 then TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + copy(copy(ExtractFileName(Listbox1.Items[index]),1,pos('.',ExtractFileName(Listbox1.Items[index]))-1),1,45)+'...') //для названия песни else TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + copy(ExtractFileName(Listbox1.Items[index]),1,pos('.',ExtractFileName(Listbox1.Items[index]))-1)); TextOut(rect.right-60, rect.top,'|'+lentime(Listbox1.Items[index]));//для времени
Можете почитать здесь: http://www.sql.ru/forum/21465/kak-poluchit-imya-fayla-bez-rasshireniya http://www.programmersforum.ru/showthread.php?t=84274
Выберите наиболее подходящий для вас способ. А вообще лучше учиться извлекать ID3 теги из самого файла.))))
|
|
| |
Praying | Дата: Понедельник, 19.08.2013, 18:10 | Сообщение # 6 |
Сержант
Группа: Пользователи
Сообщений: 20
Статус: Offline
| О! То что надо! Спасибо))) ID3 тегами я поинтересовался, но кроме информации о названии трека мне больше ничего не нужно, так что я не стал нагромождать код)) С кнопкой создающей txt файл и добавляющей в плейлист разобрался так)
Балуясь с текстовыми файлами, я обнаружил, что когда по порядку воспроизведения дело доходит до самого текстового файла в плейлисте, то плеер выдает "Ошибка загрузки файла". Этого в принципе и следовало ожидать, но можно ли сделать так, чтобы он автоматически пропускался, как это происходит в Winamp?)))
Сообщение отредактировал Praying - Среда, 14.08.2013, 11:40 |
|
| |
xaramamburu | Дата: Понедельник, 19.08.2013, 18:10 | Сообщение # 7 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Praying, Не очень понятно для чего вам нужны текстовые файлы (от этого зависит возможное решение данной задачи), но наиболее простой вариант это проверять файлы по расширению, т.е. если расширение файла не совпадает - выбираем следующий файл в плейлисте. Вот примерный код:
Код procedure TForm_Player.Player; begin //проверяем, если не пауза if mode<>paused then begin //то проверяем существует ли файл загружаемый из PlayList //если файл не существует или не того типа, то ищем следующий while not FileExists(FileName) or ((lowercase(ExtractFileExt(filename))<>'.mp3') and (lowercase(ExtractFileExt(filename))<>'.wma') and (lowercase(ExtractFileExt(filename))<>'.wav') and (lowercase(ExtractFileExt(filename))<>'.flac') and (lowercase(ExtractFileExt(filename))<>'.ogg')) do begin if i<ListBox1.Items.Count-1 then begin inc(i); Filename:=ListBox1.Items.Strings[i]; ListBox1.ItemIndex:=i; end //если лист закончился - выходим else begin ShowMessage('Файлов для воспроизведения не найдено');exit;end; end;
//останавливаем и освобождаем канал воспроизведения BASS_ChannelStop(Channel);BASS_StreamFree(Channel);
//пытаемся загрузить файл и получить дескриптор канала Channel := BASS_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); //если дескриптор канала=0 (файл по какой то причине не может быть загружен), //выдаем сообщение об ошибке и выходим if Channel=0 then begin ShowMessage('Ошибка загрузки Файла');exit;end;
//настройка эквалайзера fx[1] := BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);//первый канал эквалайзера fx[2] := BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);//второй канал fx[3] := BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1); fx[4] := BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1); fx[5] := BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1); fx[6] := BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1); fx[7] := BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1); fx[8] := BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1); fx[9] := BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1); fx[10] := BASS_ChannelSetFX(channel, BASS_FX_DX8_PARAMEQ, 1);
//настройка первого канала эквалайзера p.fGain :=15-trackbar3.Position; //усиление p.fBandwidth := 3; //ширина полосы пропускания p.fCenter := 80; //частота регулирования BASS_FXSetParameters(fx[1], @p);//применение заданных настроек //настройка второго канала эквалайзера
p.fGain := 15-trackbar4.Position; p.fBandwidth := 3; p.fCenter := 170; BASS_FXSetParameters(fx[2], @p); //и т.д. p.fGain := 15-trackbar5.Position; p.fBandwidth := 3; p.fCenter := 310; BASS_FXSetParameters(fx[3], @p);
p.fGain := 15-trackbar6.Position; p.fBandwidth := 3; p.fCenter := 600; BASS_FXSetParameters(fx[4], @p);
p.fGain := 15-trackbar7.Position; p.fBandwidth := 3; p.fCenter := 1000; BASS_FXSetParameters(fx[5], @p);
p.fGain := 15-trackbar8.Position; p.fBandwidth := 3; p.fCenter := 3000; BASS_FXSetParameters(fx[6], @p);
p.fGain := 15-trackbar9.Position; p.fBandwidth := 3; p.fCenter := 6000; BASS_FXSetParameters(fx[7], @p);
p.fGain := 15-trackbar10.Position; p.fBandwidth :=3; p.fCenter := 10000; BASS_FXSetParameters(fx[8], @p);
p.fGain := 15-trackbar11.Position; p.fBandwidth := 3; p.fCenter := 12000; BASS_FXSetParameters(fx[9], @p);
p.fGain := 15-trackbar12.Position; p.fBandwidth := 3; p.fCenter := 14000; BASS_FXSetParameters(fx[10], @p);
// конец условия проверки паузы end;
//командой BASS_ChannelPlay(Channel, False) пытаемся воспроизвести файл, //если это невозможно, то выдаем сообщение об ошибке if not BASS_ChannelPlay(Channel, False) then begin ShowMessage('Ошибка воспроизведения файла');exit;end;
//полоса проигрывания scrollbar1.Min:=0; //минимальное значение scrollbar1.Max:=bass_ChannelGEtLength(Channel, 0)-1;//максимальное значение
//присваеваем заголовку формы имя проигрываемого файла Form_Player.Caption:=ExtractFileName(FileName); //Устанавливаем PlayMode - play mode:=play; end;
Код пропускает не существующие файлы и те, которые не соответствуют заданному типу. Более сложный вариант заключается в обработке ошибки т.е. в место сообщения об ошибке и выходе из процедуры мы переходим в плейлисте на следующий файл и снова пытаемся его загрузить и воспроизвести, но здесь придется практический полностью перекроить процедуру [b]procedure TForm_Player.Player;[/b][/i] , короче говоря написать заново.))))
|
|
| |
Praying | Дата: Понедельник, 19.08.2013, 18:11 | Сообщение # 8 |
Сержант
Группа: Пользователи
Сообщений: 20
Статус: Offline
| Величайшее спасибо!!!!)))) Вы мне очень помогли))) Разделение текстовыми файлами мне нужно для работы звукооператора) Так сказать профессиональная хитрость)) Если вас не затруднит, могли бы вы мне еще подсказать) Решил подключить так же BassFlac, BassWMA, но что то очень важное непонимаю... В папку с проектом так же копировал как и Bass, разделе Uses описал, ассоциацию файлов на добавление в плейлист описал, в проверке как в вашем сообщении выше тоже есть, но почему все равно выдает ошибку "Ошибка загрузки файла", и время трека равное 1 секунде. Что то важное я пропустил... (В проекте который я вам отсылал, это есть)
|
|
| |
xaramamburu | Дата: Понедельник, 19.08.2013, 18:11 | Сообщение # 9 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Цитата Если вас не затруднит, могли бы вы мне еще подсказать) Решил подключить так же BassFlac, BassWMA, но что то очень важное непонимаю... Могу подсказать для WMA, т.к. под рукой был только он. Значит в Uses добавляете название модуля BassWMA. Далее в событии формы OnCreate (процедура procedure TForm_player.FormCreate(Sender: TObject);) после строк:
Код // Инициализация аудио - по умолчанию, 44100hz, stereo, 16 bits if not BASS_Init(-1, 44100, 0, Handle, nil) then begin MessageBox(0,'Ошибка инициализация аудио',nil,MB_ICONERROR); Halt; end; добавьте:
Код plug := BASS_PluginLoad('BassWMA.dll', 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); if Plug = 0 then begin showmessage('Плагин BassWMA не загружен'); end;
plug := BASS_PluginLoad('BassFlac.dll', 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); if Plug = 0 then begin showmessage('Плагин BassFLAC не загружен'); end; Переменную plug: HPLUGIN; опишите в разделе var процедуры procedure TForm_player.FormCreate(Sender: TObject);. В принципе если убрать все проверки, но так вы не узнаете загружен плагин или нет, то можно оставить только строчки:
Код BASS_PluginLoad('BassWMA.dll', 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});//для BassWMA BASS_PluginLoad('BassFlac.dll', 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});//для BassFlac или так для Delphi 7 (если не ошибаюсь, проверить не где, но в любом случае лучше попробовать в начале код с проверкой):
Код BASS_PluginLoad('BassWMA.dll', 0); //для BassWMA BASS_PluginLoad('BassFlac.dll', 0); //для BassFlac
Затем в событии формы OnClose (процедура procedure TForm_player.FormClose(Sender: TObject; var Action: TCloseAction);) перед строкой:
Bass_Free;// Освобождаем ресурсы используемые Bass
добавьте:
bass_pluginfree(0);// Освобождаем плагины
Внимание!!! Если плагины нормально загрузятся, то все должно работать, код приведенный ниже писать не надо. Иначе можно попробовать такой вариант:
в процедуре procedure TForm_Player.Player; в место строки:
Код //если дескриптор канала=0 (файл по какой то причине не может быть загружен), //выдаем сообщение об ошибке и выходим if Channel=0 then begin ShowMessage('Ошибка загрузки Файла');exit;end;
пишем:
Код if Channel=0 then begin Channel := BASS_WMA_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); if Channel=0 then begin ShowMessage('Ошибка загрузки Файла'); exit; end; end; После этого все должно работать.
Я думаю BassFlac подключается аналогично:
Код if Channel=0 then begin Channel := BASS_WMA_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); if Channel=0 then begin Channel := BASS_FLAC_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); if Channel=0 then begin ShowMessage('Ошибка загрузки Файла'); exit; end; end; end;
|
|
| |
xaramamburu | Дата: Понедельник, 19.08.2013, 18:11 | Сообщение # 10 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Цитата время трека равное 1 секунде. Как я уже писал выше, если плагины нормально загрузятся, то эта проблема должна исчезнуть. Иначе нужно аналогичный код добавить в процедуру вычисления времени для плагина BassWMA будет как то так:
Код 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}); if Channel1=0 then begin Channel1 := BASS_WMA_StreamCreateFile(FALSE, PChar(FileName1), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); end; //получаем время воспроизведения TrackLen:=BASS_ChannelBytes2Seconds(Channel1,BASS_ChannelGetLength(Channel1,BASS_POS_BYTE)); ValLen:=TrackLen / (24 * 3600); Lentime:=FormatDateTime('hh:mm:ss',ValLen); //освобаждаем канал BASS_StreamFree(Channel1); end; Для BassFlac все делается по аналогии.)))))
|
|
| |
Praying | Дата: Понедельник, 19.08.2013, 18:11 | Сообщение # 11 |
Сержант
Группа: Пользователи
Сообщений: 20
Статус: Offline
| Спасибо) Все отлично работает, и для FLAC и для WMA) Может быть странным, но не добавляя ничего из "Сообщение # 10", у меня все нормально отображается)) Может быть наглостью с моей стороны задавать такой глупый вопрос) Но я немогу сообразить как вывести в Label значения KHz и kbps.... При любых попытках воткнуть куда нибудь Label15.Caption:=...; ругается на label... Ваши коды:
|
|
| |
xaramamburu | Дата: Понедельник, 19.08.2013, 18:11 | Сообщение # 12 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Цитата Может быть странным, но не добавляя ничего из "Сообщение # 10", у меня все нормально отображается)) Значит у вас нормально загрузились плагины для WMA и FLAC, иначе будет неправильно отображаться время в плейлисте, а так все будет работать. ))) Цитата Но я немогу сообразить как вывести в Label значения KHz и kbps.... При любых попытках воткнуть куда нибудь Label15.Caption:=...; ругается на label... Эти коды полностью рабочие, поэтому надо смотреть ваш код. Присылайте мне на почту код с этой ошибкой, посмотрю.))))
|
|
| |
Praying | Дата: Понедельник, 19.08.2013, 18:11 | Сообщение # 13 |
Сержант
Группа: Пользователи
Сообщений: 20
Статус: Offline
| Отправил вам проект)
|
|
| |
xaramamburu | Дата: Понедельник, 19.08.2013, 18:12 | Сообщение # 14 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| Praying, Смотрите ответ на почте. Вы неправильно вызываете эти функции.)))
|
|
| |
Praying | Дата: Понедельник, 19.08.2013, 18:12 | Сообщение # 15 |
Сержант
Группа: Пользователи
Сообщений: 20
Статус: Offline
| )) Как всегда, огромное спасибо))) Кстати вариант с метками просто гениален) Мне даже такое в голову не пришло)) Это намного все упрощает)) Правда есть некоторое разногласие с выводом KBPS (// выводил в AIMP те же песни), с некоторыми песнями где то показывает на 1 больше чем нужно (например заместо 192, показывает 193), но это совсем нестрашно, методом подбора можно подредактировать в коде)))
У меня такой вопрос) Как можно сделать так чтобы, выбрав трек в плейлисте, нажать на кнопку и открылась папка в которой этот трек лежит?)
Сообщение отредактировал Praying - Воскресенье, 18.08.2013, 21:55 |
|
| |
|