ExoPlayer:从 HTTP 流中获取歌曲元数据

ExoPlayer: get songs metadata from HTTP stream

我使用以下代码通过 ExoPlayer 播放音乐流:

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

我找不到任何关于如何获取当前歌曲的艺术家和名称等元数据的信息。是否可以获取元数据,如果可以,如何获取?
非常感谢。

你可能应该使用 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)); 

来源:http://mrbool.com/how-to-extract-meta-data-from-media-file-in-android/28130#ixzz3s8PUd9E7

许多类型的媒体中有许多类型的元数据,这取决于您的流。但目前 Exoplayer 本身,只能从 HLS 流(HTTP 直播)中解析元数据,他们从流中获取 ID3 数据。

正如您在 github 存储库问题上看到的那样,这是 Exoplayer 库中元数据的当前状态(2015 年 8 月): https://github.com/google/ExoPlayer/issues/704

如果是你的直播情况,我建议你在 github (https://github.com/google/ExoPlayer/tree/release-v2/demos) 下载 Exoplayer 演示。 LogCat.

上的演示显示流 ID3 元数据中的示例之一

如果不是你的情况,ExoPlayer 库现在对你没有任何帮助。

但是还有一个替代解决方案,我已经将其用于无线电流应用程序,并且效果很好:

IcyStreamMeta 从在线流广播中获取元数据:

Getting metadata from SHOUTcast using IcyStreamMeta

但不确定它是否适用于简单的 mp3 文件。

我来晚了但是有了 Exoplayer-2。您可以使用@saschpe 创建的扩展。 https://github.com/sandeeprana011/android-exoplayer2-ext-icy

例如看到这个应用程序:https://play.google.com/store/apps/details?id=com.zilideus.jukebox_new

gradle

implementation 'saschpe.android:exoplayer2-ext-icy:1.0.1'

因此它包含一个值为 1 的额外 Header "Icy-Metadata" 在响应中,它从流数据中提取元数据。

用法:

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

对于 Icy 元数据,exoplayer 从 2.10 版开始就内置了支持。参见: