Четверг, 25.04.2024, 09:58
Приветствую Вас Гость

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

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

Меню сайта
Категории раздела
Работа с библиотеками BASS и DirectShow [14]
Статьи по написанию mp3 плеера, видеоплеера, работе с WEB камерой и т.д.
Форма входа

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


















Тиц
Главная » Статьи » Мультимедиа » Работа с библиотеками BASS и DirectShow

Delphi. Урок 1.1. Создаем mp3 player (проигрыватель) на основе библиотеки bass.dll.
Содержание
Краткая справка на русском языке по библиотеке bass.dll.
Урок 1.1. Создаем mp3 player (проигрыватель) на основе библиотеки bass.dll.
Целью данного урока является создание mp3 playera (проигрывателя) на основе библиотеки bass.dll.  В данном проекте я попытаюсь рассказать, как подключить библиотеку bass.dll, создать простейший PlayList, подключить кнопки (Play, Pause, Stop) для управления проигрыванием.

Урок 1.2. Создаем mp3 player (проигрыватель) на основе библиотеки bass.dll.
На этом уроке мы продолжим создавать mp3 player (проигрыватель). К нашему проекту подключим ScrollBar для перемотки музыки, регулятор громкости, баланса и сделаем выбор песен из PlayList.

Урок 1.3. Создаем mp3 player (проигрыватель) на основе библиотеки bass.dll.
На этом уроке мы подключим эквалайзер и сделаем визуализацию проигрывания трека для нашего mp3 проигрывателя.

Урок 1.4. Создаем mp3 player (проигрыватель) на основе библиотеки bass.dll.
На этом уроке мы научим наш проигрыватель сохранять настройки в ini файле.

 
Урок 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 или здесь.
Далее размещаем на форме компоненты как показано на рисунке.

 

 

 Создаем mp3 player (проигрыватель) на основе библиотеки bass.dll.


Самый верхний компонент 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;


Сохраняем и проверяем работу кнопок.

Исходники к уроку можно скачать здесь.

На следующем уроке мы подключим ScrollBar, регулятор громкости, баланса и сделаем выбор песен из PlayList.

 


Автор xaramamburu сайт basicsprog.ucoz.ru

 

 

 

 

 

 

Категория: Работа с библиотеками BASS и DirectShow | Добавил: xaramamburu (18.07.2011)
Просмотров: 32078 | Комментарии: 9 | Рейтинг: 3.9/25
Всего комментариев: 9
9 Felix  
0
Спасибо за урок, я этого искал на С#, но не нашел. А здесь на Delphi. По этому я не очень знаю этот язык и редактор. Можно этот код компилировать в Embarcadero Seattle 10?

8 maratmaratienski  
0
Кодprocedure TForm_player.sButton2Click(Sender: TObject);begin  for c := 1 to 10 dobegin    BASS_ChannelRemoveFX(channel, Fx
);end;
beginif mode=play thenbegin BASS_ChannelPause(Channel); mode:=paused;end;end;end;

 Вот код в понятном формате.

В редакторе кода после слова ( public ) обьявляем переменную  var c: integer; 
 Далее в редакторе кода, заменяем код обработчика событий  on Click кнопки (Button2), на этот код:

7 maratmaratienski  
0
Доброе время суток господа!
Я собрал данный плеер в точь, точь, как и описан на сайте. Плеер работает но есть одно НО!
Когда вы  жмёте на паузу и потом на кнопку плей, несколько раз,  то звук начинает искажаться и фонить, с каждым повторным нажатием все сильней и сильней, в плоть до того что не назвать то что воспроизводит плеер, музыкой.
Я долго маялся и не мог устранить этот дефект... В общем вот выход и решение данной проблемы!

В редакторе кода после слова ( public ) обьявляем переменную  var c: integer;
 Далее в редакторе кода, заменяем код обработчика событий  on Click кнопки (Button2), на этот код:

procedure TForm_player.Button2Click(Sender: TObject);

begin

  for c := 1 to 10 do

begin

    BASS_ChannelRemoveFX(channel, Fx
);

end;

begin

if mode=play then

begin

 BASS_ChannelPause(Channel);

 mode:=paused;

end;

end;

end;


Запускаем и наслаждаемся музыкой!  music 

P.S. Спасибо Автору за публикацию и за  урок!

3 DanilinNikita  
0
У меня по какой-то причине выдает "Ошибка загрузки файла", когда на этапе после добавления кнопок плей, пауза,стоп тестирую работу? В чем может быть причина?

4 xaramamburu  
0
А пример из исходника к этому уроку работает? Если работает, то ищите ошибку у себя. Скорее всего она связана со строками:
Код
//пытаемся загрузить файл и получить дескриптор канала
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 то можете попробовать заменить строку:

Channel := BASS_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
на строку:
Channel := BASS_StreamCreateFile(FALSE, PChar(FileName), 0, 0, 0);

smile

5 DanilinNikita  
0
Не сомневаюсь в правильности вашего кода, я хочу сказать, что я немного его изменил - я хочу создать на основании вашего кода диджейский пульт, потому добавил еще один плейлист и дубли кнопок, может быть в этом проблема, вот код, который у меня получился на основании вашего:
Код
var
   Form1: TForm1;
   i: integer;
   m: integer;
   filename: string;
   filename2: string;
   Channel: DWORD;
   Mode: TPlayerMode;

implementation

{$R *.dfm}

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;

    Filename:=ListBox1.Items.Strings[i];
    ListBox1.ItemIndex:=i;
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;

    Filename:=ListBox2.Items.Strings[m];
    ListBox2.ItemIndex:=m;
    end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if mode=play then exit ;
player;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
if mode=play then
begin
  BASS_ChannelStop(Channel);
  mode:=Stop;
end;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
if mode=play then
begin
  BASS_ChannelPause(Channel);
  mode:=paused;
end;
end;

procedure TForm1.Player;
begin

if mode<>paused then begin

if not FileExists(FileName) then begin ShowMessage('файл не существует');exit;end;

BASS_ChannelStop(Channel);BASS_StreamFree(Channel);

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;

end.

6 xaramamburu  
0
У вас в коде нет процедуры выбора песни из плейлиста, поэтому при нажатии кнопки Play в процедуру проигрывания трека Player не передается имя файла в переменную FileName. В событии DoubleClick плейлиста присваивайте переменной FileName полное имя файла.)))

2 SekA  
0
Бл9 я не понял как сделать sad

1 Konty  
0
Спасибо за подробный урок) Очень пригодилось)

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
Наш опрос
Оцените мой сайт
Всего ответов: 585
Уголок общения



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