Здесь я пишу свои идеи, мысли, описываю события своей жизни и просто делаю личные и рабочие заметки. «А Вы что, собираетесь жить вечно?»

Аудио-плеер на Delphi для Android с применением библиотеки BASS.

В середине прошлого года появилась необходимость написания простого приложения для мобильных платформ Android и iOS. Первым рабочим проектом стал KTeam. После его успешного запуска, появилась необходимость написания аудио-плеера, способного воспроизводить потоковое вещание интернет радиостанций.

И так, сегодня я подробно опишу, как создать простой плеер потокового вещания.

Для работы нам понадобятся среда программирования Code Gear RAD Studio XE7, работать я рекомендую именно в данной версии программы, т. к. в используемых библиотеках, имеются некоторые не стыковки в работе с предыдущими версиями.

По причине того, что встроенных средств проигрывания интернет потока не имеется, мы воспользуемся замечательной библиотекой BASS, для написания приложения для Android (для iOS следует использовать другие компоненты).

Для корректной работы библиотеки BASS я рекомендую так же установить компоненты DPF Android Native Components, я в своём примере буду использовать версию 2.8.6.

Начало

Ну я думаю процесс установки Code Gear RAD Studio XE7 описывать не стоит, поэтому сразу переходим к установке дополнительных компонентов и библиотек, потому что именно эта часть вызывает наибольшие проблемы, и именно поэтому данный этап я опишу наиболее подробно.

BASS

Идём на официальный сайт un4seen.com библиотеки, нажимаем в левом меню на ссылку BASS и скачиваем там последнюю версию для Android. На момент написания данной статьи на сайте опубликована версия 2.4 от 13 марта 2015 года. Прямая ссылка на скачивание библиотеки с официального сайта. Ссылка на скачивание с моего сайта.

Сайт библиотеки BASS Ссылки на скачивание библиотек

Примечание: я рекомендую использовать именно данную версию библиотеки, потому что предыдущие версии не работают с XE7, и при инициализации библиотеки появляется ошибка.

BASSFunctions

Для корректной работы с библиотекой, нам потребуется ещё один дополнительный файл, это BASSFunctions.pas. Данный файл опубликовал на форуме пользователь с ником 3delite.Ссылка на оригинальный файл.

DPF Android Native Components

Для корректной работы библиотек BASS, часто требуется установка компонентов DPF Android Native Components, т. к. в их составе имеется компонент для работы с аудио, без которого компилятор будет просто выдавать ошибку.

Идём на официальный сайт и скачиваем последнюю версию компонентов. Или вы можете скачать версию 2.8.6 с моего сайта.

Поехали

После того, как мы скачали все необходимые дополнительные файлы, приступаем к установке компонентов.

Начнём с DPF Android Native Components. Я рекомендую (во избежании дополнительных проблем с подключением) распаковать файлы в папку DPF.Android.Native.Components.v2.8.6 в корень диска C.

Распаковываем файлы

В каталоге с файлами, имеется файл Install.txt. У кого хорошо с английским, могут сделать всё по инструкции описанной в файле, для тех кто в школе учил немецкий, я опишу процесс установки компонентов подробно.

Запускаем Codegear RAD Studio. Далее в верхнем меню открываем Tools->Options->Delphi Options->Library.

В выпадающем списке справа выбираем платформу «32-bit Windows» и добавляем в раздел «Library path» путь к нашим компонентам.

Теперь то же самое проделываем для платформы «Android».

Теперь нам потребуется скомпилировать и установить компоненты. Для этого нажимаем File -> Open Project. Открываем проект из папки компонентов, соответствующий вашей среде программирования.

Открываем проект DPFAndroidPackagesXE7.dproj

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

Нажимаем правой кнопкой на проекте в инспекторе проекта и выбираем пункт «Build», начнётся построение проекта.

Выполняем Build

После завершение построение, опять нажимаем правой кнопкой на проекте в инспекторе и выбираем пункт «Install».

Компоненты готовы к работе. Приступим к созданию проекта.

Я набросал уже небольшой проект с парой кнопок для запуска и остановки проигрывателя и картинкой для привлечения внимания :)

Пробный проект.

Для работы в библиотекой BASS, нам потребуется в каталог с проектом добавить файл BASSFunctions.pas и указать его в разделе uses.

Добавляем файл BASSFunctions.pas. Добавляем в раздел uses.

Теперь собственно сама библиотека libbass.so. Нам необходимо добавить данную библиотек в наш проект, иначе ничего не заработает.

Открываем архив bass24-android.zip и видим... Множество папок, нас интересует на данный момент только одна libs. Распаковываем её в каталог нашего проекта.

В каталоге libs, есть три подкаталога, нас интересуют 2 из них:

  • armeabi-v7a
  • armeabi

В них находятся два разных файла libbass.so.

После того, как мы скопировали данный каталог в каталог проекта, снова возвращаемся к среде программирования и открываем раздел Deployment, для добавления наших библиотек в программу.

Deployment Добавляем библиотеки

После того, как мы добавили библиотеки в наш проект, надо поменять параметр «Remote Path» для каждой библиотеки соответственно на «library\lib\armeabi» и на «library\lib\armeabi-v7a». Данную процедуру надо проделать для обеих конфигураций «Debug» и «Release».

Библиотеки Конфигурации

Ну что, вот всё и готово к началу написания кода, а код на самом деле достаточно простой.

Объявляем глобальную переменную.

var
  uStream:HSTREAM;

В момент создания формы инициализируем библиотеку.

procedure TmainForm.FormCreate(Sender: TObject);
begin
  // Загружаем и инициализируем библиотеку
  Loadbass;
  BASS_Init(-1,44100,0,Handle,nil);
end;

На кнопку «Играть» вещаем обработчик:

procedure TmainForm.mainToolbarBarItems1Click(Sender: TObject);
var
  otStream : TStringStream;
  Result : integer;
begin
  try

    // Включаем индикатор загрузки контента
    ind1.Enabled := True;
    ind1.Visible := True;

    // Код проигрывателя
    Result := 0;

    // Закрываем старый поток
    BASS_StreamFree(uStream);

    // Создаём новый поток
    uStream :=
      BASS_StreamCreateURL(PChar('http://motochelyabinsk.ru:8000/play'),0,BASS_STREAM_STATUS or BASS_UNICODE,nil,nil);

    // Включаем проигрывание
    BASS_ChannelPlay(uStream, True);

    // Получаем и выводим название текущего трека из скрипта на сайте
    // Создаём поток UTF8
    otStream := TStringStream.Create('', CP_UTF8);
    // Делаем запрос к скрипту сайта
    IdHTTP1.Get('motochelyabinsk.ru/current-track.php', otStream);
    IdHTTP1.Disconnect;
    // Записываем название трека в Label
    Label1.Text := otStream.DataString;
    // Очищаем переменную потока
    otStream.Free;

    // Запустить таймер отслеживания изменений названия трека
    Timer1.Enabled := True;

    // Включаем и отключаем кнопки
    btn1.Enabled := False;
    btn2.Enabled := True;

  except on E: Exception do
    begin
      ShowMessage('Ошибка доступа к сети!');
    end;
  end;

end;

Ну вот в общем самый простой и работающий пример создания проигрывателя интернет радиостанций.
P.S. Чуть позже, выложу готовый пример данного приложения.

Отправить
Поделиться
Запинить
19 комментариев
Санек 2015

кросавчег:)все понятно и доступно, даже для такого овоща как я:)

Александр 2015

А не подскажите как подключить плагины, например bass_aac.so и проигрывание aac потока. Спасибо.

Бирюков Александр 2015

Там есть такая функция, как LoadBASSPlugins. Её вызов загружает все плагины в виде *.so файлов, которые необходимо так же добавить в проект.

Там вот такой код:

function LoadBASSPlugins: Boolean;
var
DocDir: string;
begin
//Result := False;
DocDir := IncludeTrailingPathDelimiter(System.IOUtils.TPath.GetLibraryPath);

BASS_PluginLoad(PChar(DocDir + ’libbassflac.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbassmidi.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbassopus.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbasswv.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbass_aac.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbass_alac.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbass_ape.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbass_mpc.so’), BASS_UNICODE);

Result := True;
end;

Так же ещё есть функция BASS_PluginLoad, для загрузки определённого плагина.

Александр 2015

Очень нужная тема, спасибо! Меня тоже очень интересует подключение libbass_aac.so и воспроизведение потока aac. Можно получить помощь профи?

Бирюков Александр 2015

Я не профи, но чем смогу, тем помогу, как говорится :)

Александр 2015

function LoadBASSPlugins: Boolean;
var
DocDir: string;
begin
//Result := False;
DocDir := IncludeTrailingPathDelimiter(System.IOUtils.TPath.GetLibraryPath);

BASS_PluginLoad(PChar(DocDir + ’libbassflac.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbassmidi.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbassopus.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbasswv.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbass_aac.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbass_alac.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbass_ape.so’), BASS_UNICODE);
BASS_PluginLoad(PChar(DocDir + ’libbass_mpc.so’), BASS_UNICODE);

Result := True;
end;
Так не получается никак. Вот рабочий поток: http://air.radiorecord.ru:8102/sd90_aac
А в FormCreate что прописывать?

Бирюков Александр 2015

Даже самому стало интересно. Вообще, теоретически, алгоритм должен быть следующий:

  1. Загрузить необходимые библиотеки в проект (в каталог с libbass.so, именно оттуда происходит загрузка).
  2. Затем инициализировать в FormCreate библиотеку.
  3. Инициализировать плагины с помощью LoadBASSPlugins, либо отдельный плагин BASS_PluginLoad.

Сейчас открыл проект, попробую проверить загрузку плагинов, а заодно подгрузить библиотеку на iOS.

Александр 2015

Ураааа! Вы просто лучшие!!!!! Получилось!!!!! Низкий поклон Вам за помощь!!!
Вот:

procedure TForm1.FormCreate(Sender: TObject);
begin
// Загружаем и инициализируем библиотеку
Loadbass;
LoadBASSPlugins;
BASS_Init(-1,44100,0,Handle,nil);
end;

Ещё раз спасибо!

Бирюков Александр 2015

Если не сложно будет, скиньте пожалуйста код мне на почту. Как добавляли файлы плагинов? Я потом обновлю статью. Заранее спасибо.

Александр 2015

Но я ещё хочу получить помощь. Как получить UserAgent типа ’Mozilla/5.0 (Linux; U; Android 4.0.3;ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30’ для libbass.so?

Бирюков Александр 2015

Это уже скорее всего только из исходников собирать и добавлять собственные модули в проект.

Александр 2015

Плагины добавлял по Вашей статье. Всё точь в точь.

Александр 2015

Вот ещё бы научить плеер делать паузу при входящих вызовах телефона, а то он хоть и тихо, но продолжает играть.

Бирюков Александр 2015

Я находил тему работы с делегатами в iOS, но к сожалению для iOS и сильно замудрено. А для iOS я использую другой компонент, он при звонке останавливается. Но там другая проблема, само по себе приложение останавливается без какой либо причины и ошибки.

Николай 2015

Спасибо автору за статью. Все написано хорошо и доступно. Только есть вопрос, как сделать регулятор громкости через TrackBar ?

Бирюков Александр 2015

Если честно не помню точно, но вроде бы имеются функции в BASS для управления громкостью. Я как-то не стал заморачиваться, большинство устройств имеют аппаратный регулятор громкости.

Александр 2017

Приветствую! Ну кто решил проблему с паузой воспроизведения при входящем вызове телефона?

Бирюков Александр 2017

Я если честно, таким вопросом не задавался даже.

Александр 2017

Вот накидал простейшее радио, можете заценить https://yadi.sk/d/Ji1JOjUp3HN3vt

Александр 2019

Здравствуте, подскажите как быть обладателям более свежих версий? Я попробовал запустить на RAD Studio 10.3 Rio (Community edition) — но в архиве проекты толькодля EX5..EX7, соответственно у меня выходят ошибки, причём в большом колличестве.

Бирюков Александр 2019

Приветствую. К сожалению, в новых студиях запускать не пробовал. Но слышал, что на форуме FMX есть статья, как более простым способом использовать данную библиотеку. Или можете попробовать задать вопрос в группе Tеlegram https://t.me/TFMXGods

Sveta Kolotova 2019

Да, хотелось чуть более свежий материал уже под новые версии XE. Будьте любезны пожалуйста.

Влад Богуславский 2020

Как правильно остановить воспроизведение? Спасибо.

Бирюков Александр 2020

Добрый день, я останавливал поток так:

// Останавливаем плеер
BASS_ChannelStop(uStream);

Подробнее можете посмотреть в данной статье.

Влад Богуславский 2020

Подскажите, пожалуйста, как заставить играть плеер когда приложение свернуто или заблокирован экран телефона? В таком режиме плеер останавливается через пару минут. Плееры из маркета это умеют. Наверно надо добавить андроид сервис в приложение... Можно пример? Без фонового воспроизведения получается бесполезный плеер.
Спасибо.

Бирюков Александр 2020

Добрый день. В другой статье есть метод, как заставить плеер играть в фоне. Вот ссылка на статью, там раздел «Проигрывание в фоне».

Влад Богуславский 2020

Здравствуйте. В статье идет речь об IOS. Подобного UIBackgroundModes в Андроид нет. Наверное решение для Андроида эта ссылка: https://github.com/War3Evo/FMX.Radio
Но вот откомпилировать не получается...
[DCC Fatal Error] DW.MultiReceiver.Android.pas(11): F1026 File not found: ’DW.GlobalDefines.inc’
Где-то ошибаюсь...

Бирюков Александр 2020

Да, что-то я затупил. Судя по всему, не работает в свежих версиях RAD Studio, но вот, как скомпилить код с данного проекта на гитхабе я не подскажу, там по идее человек предлагает аналогичную оболочку для работы с libbass. К сожалению я не проверял данный код и не пробовал его, да и собственно проектом больше не занимаюсь.

Влад Богуславский 2020

Здравствуйте.
А что у вас значит:
// Код проигрывателя
Result := 0;
Что делает эта строка?
Спасибо.

Бирюков Александр 2020

Если честно уже и не помню, вероятно, код ответа. Но самого исходного кода программы под рукой нет, более детально не подскажу.

Влад Богуславский 2020

И еще вопрос, а индикатор вы где отключаете?
ind1.Enabled := True;
Спасибо.

Бирюков Александр 2020

Индикатор изначально отключен и невидим, во время загрузки включается и становится видимым. ЗАтем при других действиях, он снова становится невидимым. Скорее всего при других обработках или нажатии на кнопку СТОП, сейчас более точно сказать уже не могу, кода под рукой нет.

Влад Богуславский 2020

Спасибо.
Найдено решение для работы музыкального плеера в Андроиде в фоне. Нужно добавить сервис, код которого тут в ответе:
https://stackoverflow.com/questions/60466609/start-foreground-service-in-delphi-10-3

Бирюков Александр 2020

Спасибо, будет полезно.