Всем здравствуйте. На днях решил подключить свой винчестер с настольного компьютера к ноутбуку: решил немного покопаться в старой информации и наткнулся на свои давние проекты, которые разрабатывал совсем давно. Решил их запустить (некоторые), проверить работают ли они вообще и тут запустил проект под названием 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” оставлено комментариев: 17.

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

  2. Виктор:

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

  3. Виктор:

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

    • Andrey:

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

  4. Виктор:

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

  5. Виктор:

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

  6. Андрей:

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

    • Andrey:

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

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

  8. Stertor:

    Всё отлично работает, просто ссылки на радиостанции дохлые.

  9. fra:

    Как можно узнать степень буферизации потока

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

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*