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

На сегодняшний день в составе FMX (FireMonkey) имеются компоненты для воспроизведения аудио- и видео- файлов — это TMediaPlayer и TMediaPlayerControl. Компоненты вполне прекрасно работают с локальными файлами, расположенными на устройстве. Однако в век облачных хранилищ и всяческого рода онлайн-сервисов с легальной музычкой было бы неплохо, если бы можно было проигрывать музыку непосредственно из Сети. По некоторым, не зависящим от нас причинам, TMediaPlayer таковые действия проводить не может. Поэтому я решил посмотреть как это в Android, в принципе, можно воспроизвести потоковое аудио и воспроизвести эти действия в Delphi XE7.
Итак, смотрим, как можно относительно просто реализовать воспроизведение потокового аудио в Delphi XE7 при работе с Android.
В Android за воспроизведение медиафайлов отвечает MediaPlayer. Этот объект имеет достаточно большие возможности работы с аудио и видео, в т.ч. позволяет подготавливать плеер к воспроизведению как синхронно, так и асинхронно, воспроизводить потоковое аудио и видео и, конечно, такие обязательные для любого медиаплеера функции как перемотка, регулировка громкости и т.д. Собственно, в Delphi при работе с Android этот объект и используется, просто не все его возможности можно реализовать так, чтобы сохранить единообразную работу и в Android и в iOS с Windows. Но нам, никто не запрещает отказаться от TMediaPlayer и работать напрямую с MediaPlayer андроида.

Для начала воспроизведем mp3-файл с заданного URL. На Stackoverflow имеется вот такой простенький примерчик:

MediaPlayer mp = new MediaPlayer();
mp.setDataSource(URL_OF_FILE);
mp.prepare();
mp.start();

В Delphi XE7 этот же пример можно представить в следующим виде:

uses ...Androidapi.JNI.Media, Androidapi.Helpers;
...
begin
  Player:=TJMediaPlayer.Create;
  Player.setDataSource(StringToJString('URL_MP3_ФАЙЛА'));
  Player.prepare;
  Player.Start()
end;

MP3-файл прекрасно будет проигрываться из Сети. Однако, довольно часто, для воспроизведения потокового аудио нам требуется получать доступ, например, по тому же OAuth и, впоследствии, передавать в заголовках запроса данные доступа. Как в итоге оказалось, что MediaPlayer в Android и с такой задачей справляется прекрасно. У этого объекта в Android имеется следующая версия метода setDataSource:

public void setDataSource (Context context, Uri uri, Map<String, String> headers)

или, на Delphi:

procedure setDataSource(context: JContext; uri: Jnet_Uri; headers: JMap); cdecl; overload;

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

var O: JHashMap;
    M: JMap;
...
  O:=TJHashMap.Create;
  O.put(StringToJString('Authorization'),StringToJString('Bearer ТУТ_TOKEN_ДОСТУПА'));
  M:=TJMap.Wrap((O as ILocalObject).GetObjectID);
  Player:=TJMediaPlayer.Create;
  Player.setDataSource(SharedActivityContext, StrToJURI('URL_MP3_ФАЙЛА'), M);
  Player.prepare; //или Player.prepareAsync

Вот так, довольно просто можно сделать из простого плеера плеер для воспроизведения потокового аудио в Delphi.

Выражаю благодарность Ярославу Бровину за помощь и разъяснение некоторых моментов по работе с Android API в Delphi.

Продолжение статьи о воспроизведении потокового аудио в Android — здесь

Книжная полка

Описание Подробно рассматривается библиотека FM, позволяющая создавать полнофункциональное программное обеспечение для операционных систем Windows и OS X, а также для смартфонов и планшетных компьютеров, работающих под управлением Android и iOS
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес

 

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
11 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Kitty
Kitty
19/11/2014 22:29

Большое спасибо!

Ваня Борисов
30/11/2014 15:39

А можете сделать пример проект а то делаю проект по вашему коду но всё выделяется красным

Ваня Борисов
Ваня Борисов
02/12/2014 10:39
Ответить на  Vlad

Спасибо

trackback

[…] продолжении темы о воспроизведении потокового аудио в Андроид сегодня рассмотрим небольшой пример того, как, […]

Владимир Завялов

Спасибо большое за ваш труд!

Андрей
Андрей
09/06/2015 00:25

Подскажите, пожалуйста, почему когда я пишу prepareAsync, музыка не воспроизводится?

Alexey
Alexey
23/10/2015 15:14

var Player : ????

какой тип ?

Олег
Олег
20/12/2015 19:51

Здравствуйте Влад.
Может глупые вопросы но тем не менее.
Расскажите пожалуйста как сделать чтобы воспроизвёлся mp3 файл при при открытии окна. Точнее я не понимаю куда файл поместить и следовательно куда прописать MediaPlayer1.FileName :=??. Вообще где храняться файлы которые задеплоины к проекту? Все ли они в одном месте на телефоне или в разных?
Вы написали path := ‘/storage/’
else path := ‘/sdcard/’; Как это понимать?
С Уважением.
Олег.

PEHA
PEHA
10/11/2016 21:21

По FTP не работает