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);


Но я не могу найти никакой информации о том, как получить метаданные, такие как исполнитель и название текущей песни.. Можно ли получить такую информацию?

Большое спасибо.
609   4  

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

    Ничего не найдено.