На сегодняшний день в составе 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.
Книжная полка
Описание Подробно рассматривается библиотека FM, позволяющая создавать полнофункциональное программное обеспечение для операционных систем Windows и OS X, а также для смартфонов и планшетных компьютеров, работающих под управлением Android и iOS
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|
Большое спасибо!
не за что :)
А можете сделать пример проект а то делаю проект по вашему коду но всё выделяется красным
Исходник тут — http://www.webdelphi.ru/2014/11/delphi-xe7-vosproizvedenie-potokovogo-audio-v-android-2-chtenie-metadannyx-mp3-fajla-id3/
Спасибо
[…] продолжении темы о воспроизведении потокового аудио в Андроид сегодня рассмотрим небольшой пример того, как, […]
Спасибо большое за ваш труд!
Подскажите, пожалуйста, почему когда я пишу prepareAsync, музыка не воспроизводится?
var Player : ????
какой тип ?
Здравствуйте Влад.
Может глупые вопросы но тем не менее.
Расскажите пожалуйста как сделать чтобы воспроизвёлся mp3 файл при при открытии окна. Точнее я не понимаю куда файл поместить и следовательно куда прописать MediaPlayer1.FileName :=??. Вообще где храняться файлы которые задеплоины к проекту? Все ли они в одном месте на телефоне или в разных?
Вы написали path := ‘/storage/’
else path := ‘/sdcard/’; Как это понимать?
С Уважением.
Олег.
По FTP не работает