ExoPlayer不会在使用FFMPEG的设备上播放音频

时间:2014-11-13 06:30:16

标签: android exoplayer

我已经设置了ExoPlayer来传输音频,它在我拥有的某些设备(例如我的Nexus 5)上运行得非常漂亮,但在其他设备上它根本不会播放任何内容。

为了消除我的应用程序的任何问题,我修改了演示应用程序,将“Dizzy”视频更改为随机MP3,我已经坐在服务器上。在DefaultRendererBuilder中,我还返回一个空的视频轨道渲染器,我只是尝试播放音频。

显然每台设备都有自己的一套编解码器,所以我怀疑可能是错误的设备正在加载和破坏。我在ExoPlayer源代码中看到了几个点,其中解码器是从MIME类型确定的,我想我已经将它缩小到FrameworkSampleSource方法prepare中的一行。

一旦setDataSource被调用,在我正在使用的华为Mate 7设备上,一切都会崩溃。看起来MediaExtractor使用FFMPEG来提取数据,这似乎不兼容。我测试过的其他设备似乎没有这样做。这是LogCat的转储

11-13 16:30:45.600 30793-30793/com.google.android.exoplayer.demo I/ExoPlayerImpl﹕ Init 1.0.13
11-13 16:30:45.605 30793-30881/com.google.android.exoplayer.demo I/﹕ uri = http://this-is-my-server.com/public/mime-test.mp3
11-13 16:30:45.605 30793-30881/com.google.android.exoplayer.demo I/﹕ after judge whether is youtube , isWidevine = 0
11-13 16:30:45.605 30793-30881/com.google.android.exoplayer.demo I/FFMPEGExtractor﹕ FFMPEGExractor opened file is [http://this-is-my-server.com/public/mime-test.mp3]
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo E/FFMPEGExtractor﹕ Can not find video stream!
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo E/FFMPEGExtractorUtils﹕ Couldn't find MIME by codec id 86017 !
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo I/FFMPEGExtractor﹕ Unknown MIME,try using ffmpegaudiodecorder to decode
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo I/FFMPEGExtractor﹕ setAudioMeta MIME = audio/ffmpeg
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo I/FFMPEGExtractor﹕ audio/ffmpeg set kKeyFFmpegCodecID,codec->codec_id =     86017
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo I/FFMPEGExtractorUtils﹕ Audio:
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo I/FFMPEGExtractorUtils﹕ {
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo I/FFMPEGExtractorUtils﹕ kKeyMIMEType = [audio/ffmpeg]
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo I/FFMPEGExtractorUtils﹕ kKeyDuration = [00:01:43.42]
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo I/FFMPEGExtractorUtils﹕ kKeyBitRate = [128000 bps]
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo I/FFMPEGExtractorUtils﹕ kKeyChannelCount = [1]
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo I/FFMPEGExtractorUtils﹕ kKeySampleRate = [44100 bps]
11-13 16:30:45.790 30793-30881/com.google.android.exoplayer.demo I/FFMPEGExtractorUtils﹕ }
11-13 16:30:45.790 30793-30883/com.google.android.exoplayer.demo I/OMXClient﹕ Using client-side OMX mux.
11-13 16:30:45.795 30793-30883/com.google.android.exoplayer.demo I/MediaCodec﹕ Found 0 pieces of codec specific data.
11-13 16:30:45.795 30793-30883/com.google.android.exoplayer.demo I/ACodec﹕ allocateBuffersOnPort,isHevc = 0
11-13 16:30:45.795 30793-30883/com.google.android.exoplayer.demo I/ACodec﹕ allocateBuffersOnPort,isHevc = 0
11-13 16:30:47.210 30793-30881/com.google.android.exoplayer.demo W/FFMPEGExtractor﹕ retry to read pakcet
11-13 16:30:47.210 30793-30881/com.google.android.exoplayer.demo W/FFMPEGExtractor﹕ retry to read pakcet
11-13 16:30:47.210 30793-30881/com.google.android.exoplayer.demo W/FFMPEGExtractor﹕ retry to read pakcet
11-13 16:30:47.210 30793-30881/com.google.android.exoplayer.demo W/FFMPEGExtractor﹕ retry to read pakcet
11-13 16:30:47.210 30793-30881/com.google.android.exoplayer.demo E/FFMPEGExtractor﹕ Reaching the end of file! streamId : 0

如您所见,它似乎无法正确检测MIME类型。如果我传入EXACT SAME文件是磁盘上的本地版本,它会播放得很好,如果它在服务器上则不行。 FFMPEG似乎不了解MIME是什么,只是使用自己的bastardised“audio / ffmeg”mime。它似乎得到持续时间等,但只是无法播放文件。

如果我在ExoPlayer上设置一个监听器,我可以看到它遍历每个状态 - 准备,缓冲,但从未准备好。它将从'缓冲'转变为'结束'。

虽然我不确定这是否是特定于ExoPlayer的问题,但肯定有人必须遇到类似的问题吗?这是一个非常基本的用例 - 只需使用线路播放MP3 -

SampleSource sampleSource = new FrameworkSampleSource(context, uri, headers, RENDERER_COUNT);
audioTrackRenderer = new MediaCodecAudioTrackRenderer(sampleSource, null, true);

没有什么太令人兴奋的了。我究竟做错了什么?我该怎么做才能解决这个问题?我甚至传入了“Content-Type”:“audio / mpeg”作为标题,它什么也没做。

2 个答案:

答案 0 :(得分:4)

Exoplayer现在有一个应用程序级别的媒体提取器(目前在开发分支上),它完全避免了这个问题,因为它没有通过Android的破坏的MediaExtractor运行。

查看演示应用程序的PlayerActivity和ExtractorRendererBuilder,了解如何使用它。

答案 1 :(得分:2)

对我而言,这看起来像是华为Mate 7的Android框架特有的错误。问题是MediaExtractor无法正常用于服务器托管的MP3文件。您可以使用相同的服务器托管MP3 URL来证明它,并使用其他使用Android的MediaPlayer的应用程序来播放它。您将找到无数的示例代码或在线使用MediaPlayer的APK。

快速谷歌搜索给了 http://examples.javacodegeeks.com/android/android-mediaplayer-example/ http://code.tutsplus.com/tutorials/create-a-music-player-on-android-song-playback--mobile-22778