Пятница, 19.04.2024, 23:35
Приветствую Вас Гость

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

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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Форум » Delphi » Создание mp3 плеера на Delphi » Разное (Работа с плейлистом, подключение плагинов и т.д.)
Разное
xaramamburuДата: Понедельник, 19.08.2013, 18:09 | Сообщение # 1
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Обсуждаем различные вопросы, связанные с созданием MP3 плеера в Delphi. Пишем сюда, если только  нет смысла создавать новую тему.)))
 
PrayingДата: Понедельник, 19.08.2013, 18:10 | Сообщение # 2
Сержант
Группа: Пользователи
Сообщений: 20
Репутация: 0
Статус: Offline
Я задался  вопросом, по поводу эквалайзера, "Как удалить деления". Много гуглил по этому поводу, везде ответ, что нужно увеличить максимальное количество делений. Попробовал на практике, деления слились в полосы (от 0 до 200 поставил), стало выглядеть более менее. Но возникли другие вопросы. Не повлияют ли такие действия на эффективность вычисления частот?  И как среди такого числа позиций, найти золотую середину, при попытке вернуться к настройкам по умолчанию. Так сказать, сделать кнопку которая бы сбрасывала настройки эквалайзера на стандартные(на середину заданную в Position)?
 
xaramamburuДата: Понедельник, 19.08.2013, 18:10 | Сообщение # 3
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: 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
Репутация: 0
Статус: Offline
Очередной раз спасибо) Очень помогло)
Вопрос по части отрисовки, можно ли как нибудь убрать вывод в плейлисте, формата? Чтобы было только название, без расширения.
Я  разделяю треки текстовым документом, и поэтому, формат мешается)
И возможно ли сделать кнопку которая бы создавала текстовый документ уже с заданным по умолчанию названием и автоматически добавляла его в плейлист?



Сообщение отредактировал Praying - Вторник, 13.08.2013, 21:16
 
xaramamburuДата: Понедельник, 19.08.2013, 18:10 | Сообщение # 5
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: 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
Репутация: 0
Статус: Offline
О! То что надо! Спасибо))) ID3 тегами я поинтересовался, но кроме информации о названии трека мне больше ничего не нужно, так что я не стал нагромождать код))
С кнопкой создающей txt файл и добавляющей в плейлист разобрался так)



Балуясь с текстовыми файлами, я обнаружил, что когда по порядку воспроизведения дело доходит до самого текстового файла в плейлисте, то плеер выдает "Ошибка загрузки файла". Этого в принципе и следовало ожидать, но можно ли сделать так, чтобы он автоматически пропускался, как это происходит в Winamp?)))



Сообщение отредактировал Praying - Среда, 14.08.2013, 11:40
 
xaramamburuДата: Понедельник, 19.08.2013, 18:10 | Сообщение # 7
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: 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
Репутация: 0
Статус: Offline
Величайшее спасибо!!!!)))) Вы мне очень помогли))) Разделение текстовыми файлами мне нужно для работы звукооператора) Так сказать профессиональная хитрость)) Если вас не затруднит, могли бы вы мне еще подсказать)
Решил подключить так же BassFlac, BassWMA, но что то очень важное непонимаю...
В папку с проектом так же копировал как и Bass, разделе Uses описал, ассоциацию файлов на добавление в плейлист описал, в проверке как в вашем сообщении выше тоже есть, но почему все равно выдает ошибку "Ошибка загрузки файла", и время трека равное 1 секунде. Что то важное я пропустил...
(В проекте который я вам отсылал, это есть)  sad
 
xaramamburuДата: Понедельник, 19.08.2013, 18:11 | Сообщение # 9
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: 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;

smile
 
xaramamburuДата: Понедельник, 19.08.2013, 18:11 | Сообщение # 10
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: 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
Репутация: 0
Статус: Offline
Спасибо) Все отлично работает, и для FLAC и для WMA) Может быть странным, но не добавляя ничего из  "Сообщение # 10", у меня все нормально отображается))
Может быть наглостью с моей стороны задавать такой глупый вопрос) Но я немогу сообразить как вывести в Label значения KHz и kbps....
При любых попытках воткнуть куда нибудь  Label15.Caption:=...; ругается на label...
Ваши коды:



 
xaramamburuДата: Понедельник, 19.08.2013, 18:11 | Сообщение # 12
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Цитата
Может быть странным, но не добавляя ничего из  "Сообщение # 10", у меня все нормально отображается))

Значит у вас нормально загрузились плагины для  WMA и FLAC, иначе будет неправильно отображаться время в плейлисте, а так все будет работать. )))
Цитата
Но я немогу сообразить как вывести в Label значения KHz и kbps....
При любых попытках воткнуть куда нибудь  Label15.Caption:=...; ругается на label...

Эти коды полностью рабочие, поэтому надо смотреть ваш код. Присылайте  мне на почту код с этой ошибкой, посмотрю.))))
 
PrayingДата: Понедельник, 19.08.2013, 18:11 | Сообщение # 13
Сержант
Группа: Пользователи
Сообщений: 20
Репутация: 0
Статус: Offline
Отправил вам проект)
 
xaramamburuДата: Понедельник, 19.08.2013, 18:12 | Сообщение # 14
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
Praying
Смотрите ответ на почте. Вы неправильно вызываете эти функции.)))
 
PrayingДата: Понедельник, 19.08.2013, 18:12 | Сообщение # 15
Сержант
Группа: Пользователи
Сообщений: 20
Репутация: 0
Статус: Offline
)) Как всегда, огромное спасибо))) Кстати вариант с метками просто гениален) Мне даже такое в голову не пришло)) Это намного все упрощает))
Правда есть некоторое разногласие с выводом KBPS (// выводил в AIMP те же песни), с некоторыми песнями где то показывает на 1 больше чем нужно (например заместо 192, показывает 193), но это совсем нестрашно, методом подбора можно подредактировать в коде)))

У меня такой вопрос) Как можно сделать так чтобы, выбрав трек в плейлисте, нажать на кнопку и открылась папка в которой этот трек лежит?)


Сообщение отредактировал Praying - Воскресенье, 18.08.2013, 21:55
 
Форум » Delphi » Создание mp3 плеера на Delphi » Разное (Работа с плейлистом, подключение плагинов и т.д.)
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:


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