В первой части мы научились правильно проигрывать музыкальный интернет-поток (радиостанции). Ну что, теперь давайте перейдем к тому, чтобы сделать визуализацию (спектрум). Для этого, как я говорил раньше нам необходим модуль spectrum_vis, который необходимо подключить в Uses, сам модуль я выложу в конце статьи, если Вы не сможете его отдельно скачать, то скачаете здесь. Далее нам необходим сам компонент, где мы будем отрисовывать нашу визуализацию, для этих целей я использовал компонент TPaintBox. Давайте его разместим на нашей форме, а затем объявим переменную Spectrum:TSpectrum. Почему я выбрал именно компонент TPaintBox, да потому что его не надо каждый раз перерисовывать, он сам это делает, а что касается, например TImage, то еще придется следить за отрисовкой (так как спектрум каждый раз меняется). На событии OnCreate нашей формы инициализируем ее:
Spectrum:=TSpectrum.Create(PaintBox1.Width,PaintBox1.Height);
Spectrum.Mode:=1;
Spectrum.BackColor:=clMenuText;
Далее на событие OnTimer компонента TTimer напишем следующий код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
FFFData:TFFTData;
begin
try
BASS_ChannelGetData(url_radio,@FFFData,BASS_DATA_FFT1024);
Spectrum.Draw(PaintBox1.Canvas.Handle,FFFData,1,1);
except
on e:Exception do
end;
end;
Здесь тип TFFTData – это массив от 0 до 512 типа Single. Для того, чтобы его использовать необходимо в Uses подключить модуль – CommonTypes.pas. В него мы будем передавать данные нашего потока с помощью функции BASS_ChannelGetData. А дальше уже на нашем спектруему мы отрисовываем эти данные, почему именно на TTimer, потому что данные постоянные меняется и их периодически необходимо менять. На таймере в свойстве Interval я выставил 100.
Далее я создал массив colors:array[1..15] of TColor, в котором перечислил 15 различных цветов, а затем случайно выбираю из этого массива цвет и задаем данный цвет нашему вузализатору спектрума. Вот и все, теперь и здесь все понятно. Черный фон не очень по сравнению со стилем формы, но это не проблема, так как цвет фона спектрума мы можем задать любой. В примере, который я выложу в статье будет как раз такой цвет, что он будет казаться прозрачным. Вот, что получилось у меня:
Теперь нам осталось рассмотреть, как реализовывать возможность записи музыкального интернет потока в файл. Для этих целей я использую свободное приложение для кодирования аудиозаписей в формате MP3. Использовать данное приложение можно следующим образом:
lame.exe [параметры] <входной_файл> <выходной_файл>
У данного приложения есть огромное количество параметров, в этой статье я Вас познакомлю только с одним, если это Вас заинтересует, то я Вам скину ссылку, где сможете ознакомиться и с другими параметрами данного приложения. Для этих целей нам необходимо будет объявить строковую переменную, в которой мы будем перечислять параметры для записи музыкального потока в файл. Для этих целей нам понадобится модуль bassenc, который необходимо подключить в Uses. На сколько я знаю в bass.dll если свои функции для записи потока, но я решил использовать именно этот, так как при помощи lame.exe можно выходной файл различным образом преобразовывать. В параметрах lame.exe мы указываем —preset standard, что означает защиту от ошибок и, конечно же, сам выходной файл, который нам необходимо получить в формате MP3.
Далее при помощи функции BASS_Encode_Start мы начинаем запись нашего потока в файл, а при помощи BASS_Encode_Stop эту запись можно остановить.
Для записи:
BASS_Encode_Start(uStream, pchar(ss), BASS_ENCODE_AUTOFREE, nil, 0);
Для остановки записи:
BASS_Encode_Stop(uStream);
Вот и все, ничего сложного нету, на основе данной библиотеки сделано очень огромное количество современных музыкальных проигрывателей. Вы можете сделать свой собственный. Я хочу этот самый проект перезапустить, для себя, что-то добавить, так как мне не очень нравиться то, как я сделал прилипающее окно эквалайзера к главному окну радио.
В этой статье я для Вас специально сделал пример, который содержит отображения спектрума, запись музыкального потока в файл, а также его остановка, проигрывание интернет потока (в частности музыкальных радиостанций), а также их остановка. Вот что у меня получилось:
В самом проекте приложены все необходимые файлы и библиотеки, которые Вам потребуются для отладки проекта или же для создания своего собственного. Кто-то может попробовать переделать его под Fire Monkey и поделиться здесь, я же о своей перезапущенной версии сообщу также здесь. Если будут какие-то вопросы по библиотеки bass.dll, то также обращаемся за помощью, если буду знать, как решить ту или иную проблему помогу, чем смогу.
Сам проект статьи Вы можете скачать здесь.