我已经设置 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 是什么,而是使用它自己的混蛋“音频/ffmeg”mime。它似乎获得了持续时间等,但无法播放文件。
如果我在 ExoPlayer 上设置一个侦听器,我可以看到它在每个状态中移动——准备、缓冲,但从未准备好。它将从“缓冲”变为“结束”。
虽然我不确定这是 ExoPlayer 特有的问题,但肯定有人遇到过类似的事情吗?这是一个非常基本的用例 - 只需使用线条播放 MP3 -
SampleSource sampleSource = new FrameworkSampleSource(context, uri, headers, RENDERER_COUNT);
audioTrackRenderer = new MediaCodecAudioTrackRenderer(sampleSource, null, true);
那里没什么太令人兴奋的。我究竟做错了什么?我能做些什么来解决它?我什至将 "Content-Type": "audio/mpeg" 作为标题传入,但它什么也没做。