Источник: webdelphi.ru
На сегодняшний день в составе 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.
Интернет-магазин