2015-11-19 113 views
4

我用下面的代碼通過ExaPlayer播放音樂蒸汽:ExoPlayer:從HTTP流獲取歌曲的元數據

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

但我無法找到如何獲取元數據像當前的藝術家和名稱的任何信息歌..有可能得到這樣的信息?
非常感謝。

+1

我自流獲取元數據面臨的,但我沒有與音頻工作。你必須看看com.google.android.exoplayer.audio.AudioTrack有初始化方法,並且在這個方法中lib與audioTrack一起工作,也許它會幫助你。 – Dima

+0

任何你可以分享代碼的方式?即時通訊尋找一種方式來升級我的應用程序從媒體播放器到exoplayer?謝謝 – alexistkd

+0

@Alexistkd,我在下面的答案中使用了IcyStreamMeta。 –

回答

7

在許多類型的媒體中有許多類型的元數據,這取決於您的流媒體。但目前Exoplayer本身只解析來自HLS流(HTTP Live Streaming)的元數據,他們從流中獲取ID3數據。

正如你可以在那裏的github倉庫的問題看,這是Exoplayer LIB元的當前狀態(2015年8月): https://github.com/google/ExoPlayer/issues/704

如果這是你流的情況下,我會建議你下載Exoplayer演示在github上(https://github.com/google/ExoPlayer/tree/master/demo)。 演示中的一個示例在LogCat上顯示流ID3元數據。

如果不是你的情況,現在沒有什麼能幫你在ExoPlayer lib中。

但是有一個替代解決方案,我已經使用了無線電流應用程序,它工作得很好:

IcyStreamMeta從網上流收音機的元數據:

Getting metadata from SHOUTcast using IcyStreamMeta

但不知道它會用簡單的mp3文件。

0

你或許應該使用MediaMetadataRetriever

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

似乎它只適用於本地文件..沒有幫助我的HTTP音樂流(收音機)。 –

+0

@AntonBalashov,你有沒有得到任何錯誤?順便說一下,文檔中有一個註釋 - 「這種方法可能很耗時」。 – Smileek

+0

@AntonBalashov嘗試此媒體retriver https://github.com/wseemann/FFmpegMediaMetadataRetriever – Dima

0

你可以使用如下代碼來做到這一點(也許你應該首先下載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

0

我遲到了但是用了Exoplayer-2。您可以使用由@saschpe創建的擴展。 https://github.com/sandeeprana011/android-exoplayer2-ext-icy

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