Урок 1.1. Создаем mp3 player (проигрыватель) на основе библиотеки bass.dll.
Целью данного урока является создание mp3 playera (проигрывателя) на основе библиотеки bass.dll.
В данном проекте я попытаюсь рассказать, как подключить библиотеку bass.dll, создать простейший PlayList, подключить кнопки (Play, Pause, Stop) для управления проигрыванием.
Приступим...
Запускаем Delphi и создаем новое приложение: File->New->VCL Forms Application – Delphi.
В свойство Name формы напишем Form_player, а Caption -> mp3player
Сохраняем модуль(unit1) с именем mp3, а проект(project1) с именем mp3player.
В папку с проектом помещаем файлы bass.dll и bass.pas. Файлы можно скачать с официального сайта www.un4seen.com или здесь.
Далее размещаем на форме компоненты как показано на рисунке.
Самый верхний компонент TPaintBox из вкладки System, в него будем выводить эффекты визуализации. Сразу установим свойство Name -> pb1 для этого компонента.
Затем размещаем компонент TScrollBar из вкладки Additional, он будет показывать текущую позицию при проигрывании трека.
Ниже слева и справа от ScrollBar размещаем компоненты TLabel из вкладки Standart. Левый Label1 будет показывать текущее время проигрывания, а правый Label2 время проигрывания трека.
В свойство Caption для Label1 и Label2 я написал Время.
Еще ниже размещаем три кнопки TButton из вкладки Standart и устанавливаем соответственно свойства Caption - Play, Pause, Stop.
Далее размещаем два компонента TTrackBar из вкладки Win32 и над ними два TLabel. Над первым Trackbar1 подписываем Громкость, над вторым Trackbar2 подписываем Баланс.
Еще ниже размещаем 10 компонентов TTrackBar для эквалайзера, свойство Orietation устанавливаем trVertical. Под ними с помощью компонентов TLabel подписываем частоты (80 Гц, 170 Гц, 310 Гц, 600 Гц, 1 кГц, 3 кГц, 6 кГц, 10 кГц, 12 кГц, 14 кГц), значения частот можно будет потом изменить по вашему усмотрению.
Под эквалайзером размещаем две кнопки TButton в свойстве Caption этих кнопок пишем Open song... и Очистить соответственно.
Под кнопками размещаем компонент TListBox из вкладки Standart.
Далее кидаем на форму компонент TOpenDialog из вкладки Dialogs и компонент TTimer из вкладки System. Свойство Interval для Timer1 устанавливаем равным 30, а свойство Option->ofAllowMultiSelect для компонента OpenDialog1 устанавливаем True.
Остальные свойства визуальных компонентов будем задавать потом.
Приступим к написанию кода программы.
В разделе Uses пропишем bass, это необходимо для подключения библиотеки Bass.dll.
Далее научимся загружать песни в PlayList.
Для этого в разделе Var объявим переменную i:integer;//номер проигрываемой песни в playlist
и пременную filename: string;//имя файла
Затем дважды щелкаем на кнопке Open song... и пишем следующий код:
procedure TForm_player.Button1Click(Sender: TObject);
var j: integer;
begin
OpenDialog1.Title := 'Open Files';
OpenDialog1.Filter := 'mp3|*.mp3'; //фильтр для файлов
//проверяем если PlayList не пустой то запоминаем номер текущей песни
//иначе устанавливаем номер песни 0 (первая позиция в PlayList)
if listbox1.Count<>0 then i:=ListBox1.ItemIndex else i:=0;
//Диалог открытия файла
if not OpenDialog1.Execute then exit;
begin
for j:=0 to OpenDialog1.Files.Count-1 do
begin
//заполняем PlayList
ListBox1.Items.Add(OpenDialog1.Files.Strings[j]);
end;
end;
//запоминаем имя файла текущей песни в плейлисте
Filename:=ListBox1.Items.Strings[i];
//Выделяем эту песню в PlayList
ListBox1.ItemIndex:=i;
end;
Сохраняем и тестируем работу PlayList.
Создадим процедуры OnClick для кнопок Play, Pause, Stop.
Кликаем дажды по кнопке Play и пишем следующий код:
procedure TForm_player.Button1Click(Sender: TObject);
begin
//Проверяем если воспроизведение уже идет то выходим
if mode=play then exit ;
//Запускаем процедуру проигрывания
player;
end;
Аналогично для кнопок Pause и Stop.
Для Pause
procedure TForm_player.Button2Click(Sender: TObject);
begin
//Проверяем идет ли воспроизведение
if mode=play then
begin
BASS_ChannelPause(Channel);//останавливаем воспроизведение - пауза
mode:=paused;//устанавливаем playmode -> пауза
end;
end;
для Stop
procedure TForm_player.Button3Click(Sender: TObject);
begin
//Проверяем идет ли воспроизведение
if mode=play then
begin
BASS_ChannelStop(Channel);//останавливаем воспроизведение - стоп
mode:=Stop;//устанавливаем playmode -> стоп
end;
end;
В разделе Var объявляем еще две переменные Channel: DWORD;//дескриптор канала Mode: TPlayerMode;//PlayMode
var
Form_player: TForm_player;
i:integer; //номер проигрываемой песни в playlist
filename: string;//имя файла Channel : DWORD;//дескриптор канала Mode: TPlayerMode;//PlayMode
В разделе Type объявляем TPlayerMode = (Stop, Play, Paused);
и создадим новую процедуру player(проигрывание файла);
Для этого перед разделом private пишем:
procedure Player;
А после раздела implementation
{$R *.dfm}
пишем код процедуры:
procedure TForm_Player.Player;
begin
//проверяем, если не пауза
if mode<>paused then begin
//то проверяем существует ли файл загружаемый из PlayList
//если файл не существует, то выходим
if not FileExists(FileName) then begin ShowMessage('Файл не существует');exit;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;
end;
//командой BASS_ChannelPlay(Channel, False) пытаемся воспроизвести файл,
//если это невозможно, то выдаем сообщение об ошибке
if not BASS_ChannelPlay(Channel, False) then
begin ShowMessage('Ошибка воспроизведения файла');exit;end;
//присваеваем заголовку формы имя проигрываемого файла
Form_Player.Caption:=ExtractFileName(FileName);
//Устанавливаем PlayMode - play
mode:=play;
end;
Для события OnCreate формы пишем:
procedure TForm_player.FormCreate(Sender: TObject);
begin
// проверка корректности загруженной BASS.DLL
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
begin
MessageBox(0,'Не корректная версия BASS.DLL',nil,MB_ICONERROR);
Halt;
end;
// Инициализация аудио - по умолчанию, 44100hz, stereo, 16 bits
if not BASS_Init(-1, 44100, 0, Handle, nil) then
begin
MessageBox(0,'Ошибка инициализация аудио',nil,MB_ICONERROR);
Halt;
end;
end;
Для события OnClose формы пишем:
procedure TForm_player.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Освобождаем объекты перед закрытием
Bass_Stop(); //останавливаем проигрывание
BASS_StreamFree(channel); // освобождаем звуковой канал
Bass_Free;// Освобождаем ресурсы используемые Bass
end;
Спасибо за урок, я этого искал на С#, но не нашел. А здесь на Delphi. По этому я не очень знаю этот язык и редактор. Можно этот код компилировать в Embarcadero Seattle 10?
В редакторе кода после слова ( public ) обьявляем переменную var c: integer; Далее в редакторе кода, заменяем код обработчика событий on Click кнопки (Button2), на этот код:
Доброе время суток господа! Я собрал данный плеер в точь, точь, как и описан на сайте. Плеер работает но есть одноНО! Когда вы жмёте на паузу и потом на кнопку плей, несколько раз, то звук начинает искажаться и фонить, с каждым повторным нажатием все сильней и сильней, в плоть до того что не назвать то что воспроизводит плеер, музыкой. Я долго маялся и не мог устранить этот дефект... В общем вот выход и решение данной проблемы!
В редакторе кода после слова ( public ) обьявляем переменную var c: integer; Далее в редакторе кода, заменяем код обработчика событий on Click кнопки (Button2), на этот код:
У меня по какой-то причине выдает "Ошибка загрузки файла", когда на этапе после добавления кнопок плей, пауза,стоп тестирую работу? В чем может быть причина?
А пример из исходника к этому уроку работает? Если работает, то ищите ошибку у себя. Скорее всего она связана со строками:
Код
//пытаемся загрузить файл и получить дескриптор канала Channel := BASS_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF}); //если дескриптор канала=0 (файл по какой то причине не может быть загружен), //выдаем сообщение об ошибке и выходим if Channel=0 then begin ShowMessage('Ошибка загрузки Файла');exit;end;
До вас такая проблема еще ни у кого не возникала.((( Если у вас Delphi7 то можете попробовать заменить строку:
Не сомневаюсь в правильности вашего кода, я хочу сказать, что я немного его изменил - я хочу создать на основании вашего кода диджейский пульт, потому добавил еще один плейлист и дубли кнопок, может быть в этом проблема, вот код, который у меня получился на основании вашего:
procedure TForm1.Button5Click(Sender: TObject); var j: integer; begin OpenDialog1.Title := 'Open Files'; OpenDialog1.Filter := 'mp3|*.mp3'; if listbox1.Count<>0 then i:=ListBox1.ItemIndex else i:=0;
if not OpenDialog1.Execute then exit; begin for j:=0 to OpenDialog1.Files.Count-1 do begin ListBox1.Items.Add(OpenDialog1.Files.Strings[j]); end; end;
procedure TForm1.Button3Click(Sender: TObject); var k: integer; begin OpenDialog2.Title := 'Open Files'; if listbox2.Count<>0 then m:=ListBox2.ItemIndex else m:=0;
if not OpenDialog2.Execute then exit; begin for k:=0 to OpenDialog2.Files.Count-1 do begin ListBox2.Items.Add(OpenDialog2.Files.Strings[k]); end; end;
Channel := BASS_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0); if Channel=0 then begin ShowMessage('ошибка загрузки файла');exit;end; end;
if not BASS_ChannelPlay(Channel, False) then begin ShowMessage('ошибка воспроизведения файла');exit;end;
Form1.Caption:=ExtractFileName(FileName); mode:=play; end; procedure TForm1.FormCreate(Sender: TObject); begin
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then begin MessageBox(0,'Не корректная версия BASS.DLL',nil,MB_ICONERROR); Halt; end;
if not BASS_Init(-1, 44100, 0, Handle, nil) then begin MessageBox(0,'Ошибка инициализация аудио',nil,MB_ICONERROR); Halt; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin //Освобождаем объекты перед закрытием Bass_Stop(); //останавливаем проигрывание BASS_StreamFree(channel); // освобождаем звуковой канал Bass_Free;// Освобождаем ресурсы используемые Bass end;
У вас в коде нет процедуры выбора песни из плейлиста, поэтому при нажатии кнопки Play в процедуру проигрывания трека Player не передается имя файла в переменную FileName. В событии DoubleClick плейлиста присваивайте переменной FileName полное имя файла.)))