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

时间:2015-11-19 11:40:35

标签: android exoplayer

我使用以下代码通过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);

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

5 个答案:

答案 0 :(得分:10)

许多类型的媒体中有许多类型的元数据,具体取决于您的流。但是目前Exoplayer本身只解析来自HLS流(HTTP Live Streaming)的元数据,他们从流中获取ID3数据。

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

如果是您的流案例,我建议您在github(https://github.com/google/ExoPlayer/tree/master/demo)上下载Exoplayer演示。 演示中的一个示例显示LogCat上的流ID3元数据。

如果不是你的情况,那么现在没有什么能帮助你在ExoPlayer lib。

但是有一种替代解决方案,我已经用于无线电流应用,它运行良好:

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

Getting metadata from SHOUTcast using IcyStreamMeta

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

答案 1 :(得分:6)

我迟到但是使用了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的额外标题“冰冷元数据” 在响应中,它从流数据中提取元数据。

用法:

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

答案 2 :(得分:0)

对于Icy元数据,exoplayer自2.10版本起已内置支持。参见:https://stackoverflow.com/a/56333429/1898380

答案 3 :(得分:-1)

您可能应该使用MediaMetadataRetriever

MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(getActivity(), uri);
String artist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);

答案 4 :(得分:-1)

您可以使用以下代码执行此操作(也许您应首先下载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