Всем здравствуйте. На днях решил подключить свой винчестер с настольного компьютера к ноутбуку: решил немного покопаться в старой информации и наткнулся на свои давние проекты, которые разрабатывал совсем давно. Решил их запустить (некоторые), проверить работают ли они вообще и тут запустил проект под названием RadioByfly, которое разрабатывал для бесплатного соединения своего Интернет-провайдера, для прослушивания радиостанций, а также их записи в mp3-файл, который сохраняется на диске. Вообще по большей степени я ее делал для себя, так как песни качать не всегда любил, а так включил радио, поставил на запись и слушаешь, а потом запустил 1.5 часовой mp3-файл и также слушаешь, если что-то надоело, заново записал.

Вот в этой статье, я бы и хотел поговорить о создании такой моей давней разработки, немного поделиться, как я ее делал, да и вообще, хочу эту разработку перезапустить, в связи выходом новых версий Delphi, с введением в них Fire Monkey я бы хотел переделать именно на данной платформе, как раз есть возможность ее немного «пощупать», узнать, а информации уже по ней итак в сети достаточно. Про цели создания этого радио уже понятно, дизайн на тот момент нарисовал на скорую руку в MS Paint, да и вообще, в дизайне я очень не силен, поэтому и получилось совсем не красиво, но, как и говорил выше, есть возможность перезапустить данный проект, надо же двигаться немного вперед. Что касается кроме как того, что в радио есть возможность запись музыкального потока в файл, то я еще к нему приделал визуализацию (спектрум) песенного потока, которая есть во всех современных музыкальных проигрывателях.

Для написания интернет-радио я использовал библиотеку bass.dll, конечно же, она не идет ни в какие сравнения с компонентом Delphi TMediaPlayer. Сам внешний вид радио, которое я когда-то делал, присутствует ниже, не судите строго за его внешний вид, для меня графика – это сложно.

В радио также присутствует эквалайзер, как видно на скриншоте, имеется плэйлист, а также возможность добавления новой радиостанции, есть кнопка записи, выходной файл ложиться в папку out, которая находиться в корне с проектом под именем «Запись №». Данный файл потом можно будет запускать с помощью любого музыкального проигрывателя, а также можно будет и прикрутить к нашему радио, чтобы могло проигрывать локальные музыкальные файлы. Саму визуализацию (спектрум) я реализовывал с помощью модуля spectrum_vis.pas, которую вырисовывал на компоненте TPaintBox. Рисовался он на черном фоне, выводился в виде белых полос, как видно на экране, они не совсем белые, а другого цвета, но я скажу больше, что они почти каждые половину секунды меняются в различные цвета (всего их 15), это я организовал с помощью таймера, никто не запретит Вам сделать просто одним цветом.

В этой статье я хотел бы поделиться о том, как я создал эквалазейр, визуализацию (спектрум) и само проигрывание интернет потока радио, но также рассмотрим, как можно организовать и проигрывания локальных музыкальных файлов.

Итак, теперь давайте поговорим о том, какие функции и процедуры библиотеки bass.dll необходимо использовать для того, чтобы проиграть обычную радиостанцию. Для начала нам необходимо скачать последнюю версию библиотеки, она имеет версию 2.4.9. Скачать ее можно с официального сайта, в поисковике, например, Google Вам достаточно ввести «bass.dll» и первый результат выдачи поисковика будет официальный сайт.

После того, как библиотеку скачали для Delphi, подключаем ее в наш проект, в раздел uses (прописываем Bass). Далее нам необходимо инициализировать саму библиотеку (само звуковое устройство), для этого на событии OnCreate нашей главной формы необходимо написать:

BASS_Init(-1,44100,0,Handle,nil);

Данная функция инициализирует устройство вывода звукового потока. Первый параметр у нас равен -1, который означает на какой устройство будет выводится звуковой поток:

  • -1 – устройство по умолчанию
  • 0 – без звука
  • 1 – первое реальное, найденное устройство вывода, функция BASS_GetDeviceInfo может получить список всех звуковых устройств.

Второй параметр у нас равен 44100, который означает выходную частоту звукового потока. Третий параметр у нас равен 0, который может принимать различные значения флагов: вывод в моно режиме, в стерео режиме и так далее. Четвертый параметр – дескриптор основного окна приложения. И наконец, последний параметр означает объект, который может быть использован для создания DirectSound. Данная функция возвращает True, если устройство было инициализировано и False в противном случае.

Также на данной событие формы (OnCreate), я установил конфигурационное значение, для проигрывания, это я сделал с помощью:

  • BASS_SetConfig(BASS_CONFIG_NET_PLAYLIST, 1);
  • BASS_CONFIG_NET_PLAYLIST – означает что будут проигрываться URL-плэйлисты, такие как PLS или M3U.

Дальше нам необходимо сформировать наш плэйлист. Для этих целей я использовал компонент TListBox, а при нажатии на кнопку добавить новую радиостанцию, я показывал компонент TEdit снизу формы, а при повторном нажатии на кнопку добавить – скрывал компонент TEdit. Все список радиостанций я сразу создал и по умолчанию загружаю его в TListBox из файла playlist.pls, который также находится в корне с программой.

Немного с интерфейсом разобрались. Теперь создадим кнопку проигрывания радиостанции и на событие OnClick давайте напишем следующий код:

procedure TForm1.BitBtn5Click(Sender: TObject);
var
   url:string;
   len,bitrate:Word;
   url_radio:HSTREAM;
begin
   try
    url:=ListBox1.Items[ListBox1.itemindex];
    BASS_StreamFree(url_radio);
    url_radio:=BASS_StreamCreateURL(PAnsichar(url),0,BASS_STREAM_STATUS,nil,0);
    BASS_ChannelPlay(url_radio,False);
    Label2.Caption:=BASS_ChannelGetTags(url_radio,BASS_TAG_HTTP);
   len:=BASS_StreamGetFilePosition(url_radio, BASS_FILEPOS_END); // file length
    bitrate:=round(len/(125*time)+0.5); // bitrate (Kbps)
    Label3.Caption:='bitrate '+IntToStr(bitrate)+'Kbps ';
   except
    on e:Exception do
   end;
end;

Переменная url типа string – для того, чтобы получать сам адрес радиостанции в виде строки, которая находится в  TListBox. С помощью функции BASS_StreamFree мы освобождает память от нашего потока. Я это делаю на тот случай, если уже у нас радиостанция проигрывается на данный момент.

Затем мы с помощью функции BASS_StreamCreateURL создаем музыкальный поток, который поддерживает интернет-файлы для проигрывания (это как раз и есть наши радиостанции). Далее с помощью функции BASS_ChannelPlay мы воспроизводим наш музыкальный поток. Все радиостанция играет все довольные, дальше я уже добавлял свои фишки, получал битрейт, отображал его, а также тип Интернет-соединения, на котором проигрываются радиостанции. Это по желанию каждого.

Ну, вот и все, теперь Вы можете уже проигрывать радиостанции, для удобства на событие OnDbClick компонента TListBox написал следующий код:

BitBtn5Click(Sender);

То есть, по нажатию на любой Item TListBox двойным щелчком будет проигрываться также радиостанция. Но это я тоже так, для себя делал.

Для того чтобы остановить проигрывание радиостанции, необходимо просто написать следующий код:

BASS_ChannelPause(url_radio);

Тут также все понятно, в данную функцию передаем наш звуковой поток, который нам необходимо остановить.

Продолжение второй части статьи через 2 дня, вместе с иходными кодами и библиотеками.

Метки: , , ,




К записи “Bass.dll создание интернет-радио. Часть 1” оставлено комментариев: 12.

  1. [...] первой части мы научились правильно проигрывать музыкальный [...]

  2. Виктор:

    Ты бы немог скинуть проект, в таком виде, как он запечатлён у тебя в этой статье??

  3. Виктор:

    Просто я бы хотел узнать как сделать эквалайзер и как можно сделать добавление новых радиостанций

    • Andrey:

      добавление новых радиостанцией делается легко, просто из TEdit добавляете в TListBox, а что касается эквалайзера, то пишите мне в скайп, помогу

  4. Виктор:

    Мне нужно знать как сделать так чтобы можно было добавить и при этом сохранялась радиостанция.
    Скажите свой ник в скайпе

  5. Виктор:

    Не могли бы вы написать свой мобильный телефон(какой оператор и номер) я тоже из белорусии.

  6. Андрей:

    Можно как-нибудь реализовать так, что бы вместо ссылок в листбоксе можно было написать название станций, но чтобы они остались рабочими?

    • Andrey:

      пожалуйста, сделайте 2 листбокса, один скройте, в одном название (он видимый), второй ссылки, либо сделайте один листбокс, в нем названием, а впеременной TStrings ссылки, либо напрямую берите ссылки из текстового файла, по всякому можно

  7. samsim:

    Отличная статья. Библиотека очень пригодилась. Но вот программка почему то не работает. Надо будет разобраться.

Оставить комментарий на Виктор

Вы можете использовать следующие теги:

*