Среда, 22.11.2017, 01:55
Приветствую Вас Гость

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

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

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

Статистика

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


















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

Delphi. Урок 1.2. Создаем 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.2. Создаем mp3 player (проигрыватель) на основе библиотеки bass.dll.


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

И так начнем со ScrollBar.

В процедуру procedure TForm_Player.Player; добавим следующие строки

//полоса проигрывания
    scrollbar1.Min:=0; //минимальное значение
    scrollbar1.Max:=bass_ChannelGEtLength(Channel, 0)-1;//максимальное значение


Здесь и далее добавляемый код выделен красным цветом.

procedure TForm_Player.Player;
begin
//проверяем, если не пауза
if mode<>paused then begin
//то проверяем существует ли файл загружаемый из PlayList
//если файл не существует, то выходим
if not FileExists(FileName) then begin ShowMessage('Файл не существует');exit;end;
//иначе пытаемся загрузить файл и получить дескриптор канала
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;

//полоса проигрывания
    scrollbar1.Min:=0; //минимальное значение
    scrollbar1.Max:=bass_ChannelGEtLength(Channel, 0)-1;//максимальное значение


//присваеваем заголовку формы имя проигрываемого файла
Form_Player.Caption:=ExtractFileName(FileName);
 //Устанавливаем PlayMode - play
 mode:=play;
end;



Для события OnScroll компонента ScrollBar1 пишем:

procedure TForm_player.ScrollBar1Scroll(Sender: TObject;
  ScrollCode: TScrollCode; var ScrollPos: Integer);
begin
//устанавливаем позицию воспроизведения трека в зависимости от положения scrollbar
 bass_ChannelSetPosition(Channel, scrollbar1.position, 0);
end;


Изменять положение ScrollBar мы будем по таймеру, для этого в событии OnTimer компонента Timer1 пишем следующий код:

procedure TForm_player.Timer1Timer(Sender: TObject);
var
TrackLen, TrackPos: Double;
ValPos: Double;
ValLen: Double;
begin
//проверяем режим воспроизведения, если не Play то выходим
if mode<>play then Exit;

//устанавливаем позицию scrollbar в зависимоти от позиции трека
scrollbar1.Position:=bass_channelGetPosition(channel,0);

//время проигрывания трека
//считаваем сколько секунд прошло от начала воспроизведения
TrackPos:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetPosition(Channel,0));
//считываем всю длину песню в секундах
TrackLen:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel,0));
//переводим секунды в часы
ValPos:=TrackPos / (24 * 3600);
ValLen:=TrackLen / (24 * 3600);
//Выводим данные о времени на форму в Label1 и Label2
Label1.Caption:=FormatDateTime('hh:mm:ss',ValPos);
Label2.Caption:=FormatDateTime('hh:mm:ss',ValLen);
end;


Далее подключим управление громкостью и балансем.

В событии OnCreate формы зададим начальные настройки для TrackBar1(громкость) и TrackBar2(баланс).

//установка громкости
    trackbar1.Min:=0;
    trackbar1.Max:=10;
    trackbar1.Position:=5;
  //установка баланса
    trackbar2.Min:=-5;
    trackbar2.Max:=5;
    trackbar2.Position:=0;


procedure TForm_player.FormCreate(Sender: TObject);
begin
  //установка громкости
    trackbar1.Min:=0;
    trackbar1.Max:=10;
    trackbar1.Position:=5;
  //установка баланса
    trackbar2.Min:=-5;
    trackbar2.Max:=5;
    trackbar2.Position:=0;


  // проверка корректности загруженной 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;


В событии OnTimer компонента Timer1 добавим следующий код:

//установка громкости звука
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_VOL, trackBar1.Position/10);
//установка баланса
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_PAN, Trackbar2.Position/5);



procedure TForm_player.Timer1Timer(Sender: TObject);
var
TrackLen, TrackPos: Double;
ValPos: Double;
ValLen: Double;
begin
//проверяем режим воспроизведения, если не Play то выходим
if mode<>play then Exit;

//устанавливаем позицию scrollbar в зависимоти от позиции трека
scrollbar1.Position:=bass_channelGetPosition(channel,0);

//время проигрывания трека
//считаваем сколько секунд прошло от начала воспроизведения
TrackPos:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetPosition(Channel,0));
//считываем всю длину песню в секундах
TrackLen:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel,0));
//переводим секунды в часы
ValPos:=TrackPos / (24 * 3600);
ValLen:=TrackLen / (24 * 3600);
//Выводим данные о времени на форму в Label1 и Label2
Label1.Caption:=FormatDateTime('hh:mm:ss',ValPos);
Label2.Caption:=FormatDateTime('hh:mm:ss',ValLen);

//установка громкости звука
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_VOL, trackBar1.Position/10);
//установка баланса
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_PAN, Trackbar12.Position/5);


end;



Теперь научим наш проигрыватель выбирать песни из плейлиста.

Для этого в событии OnTimer компонента Timer1 добавим следующий код:

//воспроизведение следующей песни
//если время проигрывания равно длине песни по времени,
if  BASS_ChannelGetPosition(channel, 0)= BASS_ChannelGetLength(channel, 0) then

// в место  if  BASS_ChannelGetPosition(channel, 0)=BASS_ChannelGetLength(channel, 0) then
// можно сделать так: if  BASS_ChannelIsActive(channel)=BASS_ACTIVE_STOPPED   then
// Практика показывает, что второй вариант более предпочтительный,
// т.к. проверка по длине трека иногда приводит к ошибкам в работе плеера.
   begin
//то выбираем следующую песню из плейлиста
if i<ListBox1.Items.Count-1 then
   begin
    inc(i);
 Filename:=ListBox1.Items.Strings[i];
 ListBox1.ItemIndex:=i;
    mode:=stop;
    player;
   end
//если лист закончился - выходим
else exit;
   end;


procedure TForm_player.Timer1Timer(Sender: TObject);
var
TrackLen, TrackPos: Double;
ValPos: Double;
ValLen: Double;
begin
//проверяем режим воспроизведения, если не Play то выходим
if mode<>play then Exit;

//воспроизведение следующей песни
//если время проигрывания равно длине песни по времени,
if  BASS_ChannelGetPosition(channel, 0)= BASS_ChannelGetLength(channel, 0) then

// в место  if  BASS_ChannelGetPosition(channel, 0)=BASS_ChannelGetLength(channel, 0) then
// можно сделать так: if  BASS_ChannelIsActive(channel)=BASS_ACTIVE_STOPPED   then
// Практика показывает, что второй вариант более предпочтительный,
// т.к. проверка по длине трека иногда приводит к ошибкам в работе плеера.
   begin
//то выбираем следующую песню из плейлиста
if i<ListBox1.Items.Count-1 then
   begin
    inc(i);
 Filename:=ListBox1.Items.Strings[i];
 ListBox1.ItemIndex:=i;
    mode:=stop;
    player;
   end else exit;
   end;


//устанавливаем позицию scrollbar в зависимости от позиции трека
scrollbar1.Position:=bass_channelGetPosition(channel,0);

//время проигрывания трека
//считываем сколько секунд прошло от начала воспроизведения
TrackPos:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetPosition(Channel,0));
//считываем всю длину песню в секундах
TrackLen:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel,0));
//переводим секунды в часы
ValPos:=TrackPos / (24 * 3600);
ValLen:=TrackLen / (24 * 3600);
//Выводим данные о времени на форму в Label1 и Label2
Label1.Caption:=FormatDateTime('hh:mm:ss',ValPos);
Label2.Caption:=FormatDateTime('hh:mm:ss',ValLen);

//установка громкости звука
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_VOL, trackBar1.Position/10);
//установка баланса
BASS_ChannelSetAttribute(Channel,BASS_ATTRIB_PAN, Trackbar12.Position/5);

end;


Выбор песни двойным щелчком мыши на ней в плейлисте.
Для события OnDblClick компонента ListBox1 пишем код:

procedure TForm_player.ListBox1DblClick(Sender: TObject);
begin
 i:=ListBox1.Itemindex;
 Filename:=ListBox1.Items.Strings[i];
 mode:=stop;
 player;
end;


Очистка плейлиста.

Для события Onclick кнопки Очистить пишем следующий код:

procedure TForm_player.Button5Click(Sender: TObject);
begin
//очистка плейлиста
ListBox1.Clear;
end;


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

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

На следующем уроке мы подключим эквалайзер и сделаем визуализацию проигрывания трека.

 


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

 

 

 

 

 

Категория: Работа с библиотеками BASS и DirectShow | Добавил: xaramamburu (18.07.2011)
Просмотров: 9741 | Комментарии: 3 | Рейтинг: 5.0/4
Всего комментариев: 3
2  
можешь сделать так чтобы вовремя перемотки скроллбар отстановился и как перемотка не происходит снова шел.

3  
Здесь скроллбар играет роль бегунка, за который перетаскивая, изменяется позиция воспроизведение песни. В место скроллбара можете использовать прогрессбар. Смотрите тему на форуме "Перемотка песен". Этот вариант перемотки немного по интересней да и выглядит лучше.))))))))))))))

1  
а скроллбар вовремя перемотки движется.

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



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