Категории раздела |
Мультимедиа [4]
Статьи по написанию программ на Delphi связанных с Video или Audio информацией.
|
|
Статистика |
 |
|
Delphi. Урок 1.3. Создаем mp3 player (проигрыватель) на основе библиотеки bass.dll.
Урок 1.3. Создаем mp3 player (проигрыватель) на основе библиотеки bass.dll.
На этом уроке мы подключим эквалайзер и сделаем визуализацию проигрывания трека для нашего mp3 проигрывателя.
Начнем с начальных настроек TrackBar ов эквалайзера. Для этого в инспекторе объектов для всех десяти TrackBar ов эквалайзера устанавливаем свойство Min->0, Max->30, Position->15, TickMarks->tmBoth.
в разделе Var добавляем еще две переменные необходимые для настройки эквалайзера:
//переменные для настройки эквалайзера p: BASS_DX8_PARAMEQ; fx: array[1..10] of integer
Здесь и далее добавляемый код выделен красным цветом.
var Form_player: TForm_player; i:integer; //номер проигрываемой песни в playlist filename: string;//имя файла Channel : DWORD;// Mode: TPlayerMode;//PlayMode //переменные для настройки эквалайзера p: BASS_DX8_PARAMEQ; fx: array[1..10] of integer
А в процедуре procedure TForm_Player.Player;
добавляем следующий код:
//настройка эквалайзера 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);
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;
//настройка эквалайзера 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);
//командой 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;
procedure TForm_player.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin //устанавливаем позицию воспроизведения трека в зависимости от положения scrollbar bass_ChannelSetPosition(Channel, scrollbar1.position, 0); end;
Для каждого TrackBar эквалайзера в событии OnChange пишем код:
procedure TForm_player.TrackBar3Change(Sender: TObject); begin BASS_FXGetParameters(fx[1], @p);//считываем параметры канала p.fgain := 15-TrackBar3.position;//задаем усиление в зависимости от позиции TrackBar BASS_FXSetParameters(fx[1], @p);//устанавливаем измененные параметры end;
procedure TForm_player.TrackBar4Change(Sender: TObject); begin BASS_FXGetParameters(fx[2], @p);//считываем параметры канала p.fgain := 15-TrackBar4.position;//задаем усиление в зависимости от позиции TrackBar BASS_FXSetParameters(fx[2], @p);//устанавливаем измененные параметры end;
procedure TForm_player.TrackBar5Change(Sender: TObject); begin BASS_FXGetParameters(fx[3], @p);//считываем параметры канала p.fgain := 15-TrackBar5.position;//задаем усиление в зависимости от позиции TrackBar BASS_FXSetParameters(fx[3], @p);//устанавливаем измененные параметры end;
procedure TForm_player.TrackBar6Change(Sender: TObject); begin BASS_FXGetParameters(fx[4], @p);//считываем параметры канала p.fgain := 15-TrackBar6.position;//задаем усиление в зависимости от позиции TrackBar BASS_FXSetParameters(fx[4], @p);//устанавливаем измененные параметры end;
procedure TForm_player.TrackBar7Change(Sender: TObject); begin BASS_FXGetParameters(fx[5], @p);//считываем параметры канала p.fgain := 15-TrackBar7.position;//задаем усиление в зависимости от позиции TrackBar BASS_FXSetParameters(fx[5], @p);//устанавливаем измененные параметры end;
procedure TForm_player.TrackBar8Change(Sender: TObject); begin BASS_FXGetParameters(fx[6], @p);//считываем параметры канала p.fgain := 15-TrackBar8.position;//задаем усиление в зависимости от позиции TrackBar BASS_FXSetParameters(fx[6], @p);//устанавливаем измененные параметры end;
procedure TForm_player.TrackBar9Change(Sender: TObject); begin BASS_FXGetParameters(fx[7], @p);//считываем параметры канала p.fgain := 15-TrackBar9.position;//задаем усиление в зависимости от позиции TrackBar BASS_FXSetParameters(fx[7], @p);//устанавливаем измененные параметры end;
procedure TForm_player.TrackBar10Change(Sender: TObject); begin BASS_FXGetParameters(fx[8], @p);//считываем параметры канала p.fgain := 15-TrackBar10.position;//задаем усиление в зависимости от позиции TrackBar BASS_FXSetParameters(fx[8], @p);//устанавливаем измененные параметры end;
procedure TForm_player.TrackBar11Change(Sender: TObject); begin BASS_FXGetParameters(fx[9], @p);//считываем параметры канала p.fgain := 15-TrackBar11.position;//задаем усиление в зависимости от позиции TrackBar BASS_FXSetParameters(fx[9], @p);//устанавливаем измененные параметры end;
procedure TForm_player.TrackBar12Change(Sender: TObject); begin BASS_FXGetParameters(fx[10], @p);//считываем параметры канала p.fgain := 15-TrackBar12.position;//задаем усиление в зависимости от позиции TrackBar BASS_FXSetParameters(fx[10], @p);//устанавливаем измененные параметры end;
Вот и все эквалайзе готов. Если вас не устраивает качество регулировки звука, то можно поиграть с параметрами p.fBandwidth и p.fCenter(с полосой пропускания и центральной частотой канала регулирования).
Далее делаем визуализацию проигрывания музыки. Для этого я использую готовую визуализацию из примеров по Bass.dll.
{ Spectrum Visualyzation by Alessandro Cappellozza version 0.8 05/2002 http://digilander.iol.it/Kappe/audioobject}
немного переделав ее под свой проигрыватель.
В разделе Type добавим следующую строку:
TFFTData = array [0..512] of Single;
type TFFTData = array [0..512] of Single; TPlayerMode = (Stop, Play, Paused); TForm_player = class(TForm) pb1: TPaintBox; Label1: TLabel;
В разделе Var добавим строки
//переменные визуализации FFTPeacks : array [0..128] of Integer; FFTFallOff : array [0..128] of Integer;
var Form_player: TForm_player; i:integer; //номер проигрываемой песни в playlist filename: string;//имя файла Channel : DWORD;// Mode: TPlayerMode;//PlayMode //переменные для настройки эквалайзера p: BASS_DX8_PARAMEQ; fx: array[1..10] of integer; //переменные визуализации FFTPeacks : array [0..128] of Integer; FFTFallOff : array [0..128] of Integer;
Создаем процедуру визуализации, для этого в разделе Type перед разделом private описываем процедуру Draw;
procedure Draw(HWND : THandle; FFTData : TFFTData; X, Y : Integer);
private { Private declarations }
public { Public declarations } end;
После раздела
implementation {$R *.dfm}
Прописываем саму процедуру:
procedure TForm_Player.Draw(HWND : THandle; FFTData : TFFTData; X, Y : Integer); var i, YPos : LongInt; YVal : Single; begin //очистка области визуализации pb1.Canvas.Pen.Color := clBlack; pb1.Canvas.Brush.Color := clBlack; pb1.Canvas.Rectangle(0, 0, pb1.Width, pb1.Height); //визуализация // pb1.Canvas.Pen.Color := clRed; for i := 0 to 127 do begin // количество столбиков YVal := Abs(FFTData[i]); YPos := trunc((YVal) * 500); if YPos > pb1.Height then YPos := pb1.Height;
if YPos >= FFTPeacks[i] then FFTPeacks[i] := YPos else FFTPeacks[i] := FFTPeacks[i] - 1;
if YPos >= FFTFallOff[i] then FFTFallOff[i] := YPos else FFTFallOff[i] := FFTFallOff[i] - 3; //рисование пика pb1.Canvas.Pen.Color := clYellow; pb1.Canvas.MoveTo(X + i*(3+1) , Y + pb1.Height - FFTPeacks[i]); pb1.Canvas.LineTo(X + i*(3+1) + 3, Y + pb1.Height - FFTPeacks[i]); //рисование столбика pb1.Canvas.Pen.Color := clRed; pb1.Canvas.Brush.Color := clRed; pb1.Canvas.Rectangle(X + i*(3+1) , Y + pb1.Height - FFTFallOff[i], X + i*(3+1) + 3, Y + pb1.Height);
end;
end;
В событии OnTime компонента Timer1 добавим строки вызова визуализации в var FFTFata : TFFTData;
в самой процедуре:
//вызов визуализации BASS_ChannelGetData(Channel, @FFTFata, BASS_DATA_FFT1024); Draw (pb1.Canvas.Handle, FFTFata, 0,-5);
procedure TForm_player.Timer1Timer(Sender: TObject); var FFTFata : TFFTData; 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;
//вызов визуализации BASS_ChannelGetData(Channel, @FFTFata, BASS_DATA_FFT1024); Draw (pb1.Canvas.Handle, FFTFata, 0,-5);
//устанавливаем позицию 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, Trackbar2.Position/5);
end;
в событии OnPaint компонента pb1(TPaintBox) пишем следующий код:
procedure TForm_player.pb1Paint(Sender: TObject); begin //фон окна визуализации pb1.Canvas.Pen.Color:=clBlack; //цвет пера pb1.Canvas.Brush.Color:=clBlack;//цвет кисти pb1.Canvas.Rectangle(0,0,pb1.Width,pb1.Height); //рисуем прямоугольник фон end;
На этом визуализация закончена.
Сохраняем и запускаем проект.
Исходники к уроку можно скачать здесь.
На следующем уроке мы научим наш проигрыватель сохранять настройки в ini файле.
Автор xaramamburu, сайт basicsprog.ucoz.ru
|
Категория: Мультимедиа | Добавил: TaKtiK (09.08.2012)
|
Просмотров: 3543
| Рейтинг: 0.0/0 |
|
|
|