ExoPlayer: получение метаданных песен из потока HTTP
Я использую следующий код для воспроизведения музыки steam с помощью ExaPlayer:
exoPlayer = ExoPlayer.Factory.newInstance(numRenderers, minBufSize, maxBufSize);
String url = Helper.getPr().getString("url", "http://mp3.nashe.ru:80/ultra-128.mp3");
Uri uri = Uri.parse(url);
Log.i(TAG, "Going to open " + url);
Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE);
DataSource dataSource = new DefaultUriDataSource(getApplicationContext(), USER_AGENT);
ExtractorSampleSource sampleSource = new ExtractorSampleSource(uri, dataSource, allocator, BUFFER_SEGMENT_COUNT * BUFFER_SEGMENT_SIZE);
audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource);
exoPlayer.addListener(this);
exoPlayer.sendMessage(audioRenderer, MediaCodecAudioTrackRenderer.MSG_SET_VOLUME, volume);
exoPlayer.prepare(audioRenderer);
exoPlayer.setPlayWhenReady(true);
Но я не могу найти никакой информации о том, как получить метаданные, такие как исполнитель и название текущей песни.. Можно ли получить такую информацию?
Большое спасибо.
4 ответов:
Существует множество типов метаданных во многих типах носителей, это зависит от вашего потока. Но в настоящее время Exoplayer сам, только разбирает метаданные из потоков HLS (HTTP Live Streaming) они получают данные ID3 из потока.
Как вы можете видеть в выпуске репозитория github, это текущее состояние метаданных в Exoplayer lib (август 2015 г.): https://github.com/google/ExoPlayer/issues/704
Если это ваш потоковый случай, я рекомендую вам скачать демо-версию Exoplayer на github (https://github.com/google/ExoPlayer/tree/master/demo ). Один из примеров в демо-версии отображает поток метаданных ID3 на LogCat.
Если это не ваш случай, ничто не поможет вам в ExoPlayer lib прямо сейчас.
Но есть альтернативное решение, которое я использовал для приложения радиопотока, и оно хорошо работает:
IcyStreamMeta для получения метаданных из онлайн-потока Радио:
Получение метаданных из SHOUTcast с помощью IcyStreamMeta
Но не уверен, что он будет работать с простым mp3-файлом.
Я опоздал, но с Экзоплаером-2. Вы можете использовать расширение, созданное @saschpe. https://github.com/sandeeprana011/android-exoplayer2-ext-icy
Gradle
implementation 'saschpe.android:exoplayer2-ext-icy:1.0.1'Таким образом, он включает дополнительный заголовок "Icy-Metadata" со значением 1 и при ответе он извлекает метаданные из потока данных.
Использование:
IcyHttpDataSourceFactory factory = new IcyHttpDataSourceFactory.Builder(Util.getUserAgent(this, getResources().getString(R.string.app_name))) .setIcyHeadersListener(this) .setIcyMetadataChangeListener(this).build(); DefaultDataSourceFactory datasourceFactory = new DefaultDataSourceFactory(getApplicationContext(), null, factory); ExtractorMediaSource mediaSource = new ExtractorMediaSource.Factory(datasourceFactory) .setExtractorsFactory(new DefaultExtractorsFactory()) .createMediaSource(uri); Exo.resetPlayer(); Exo.getPlayer(this).prepare(mediaSource);
Вероятно, вам следует использовать MediaMetadataRetriever
MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(getActivity(), uri); String artist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
Для этого вы можете использовать следующий код (возможно, вам следует сначала загрузить mp3-файл):
MediaMetadataRetriever metaRetriver = new MediaMetadataRetriever(); metaRetriver.setDataSource("LOCAL MP3 FILE PATH"); byte[] picArray = metaRetriver.getEmbeddedPicture(); Bitmap songImage = BitmapFactory .decodeByteArray(picArray, 0, picArray.length); String albumName = metaRetriver .extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM); String artistName = metaRetriver .extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST); String songGenre = metaRetriver .extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE));Source:http://mrbool.com/how-to-extract-meta-data-from-media-file-in-android/28130#ixzz3s8PUd9E7
Comments