4

我已经设置 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" 作为标题传入,但它什么也没做。

4

2 回答 2

4

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

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

于 2015-04-19T00:56:42.747 回答
2

在我看来,这看起来像是 Huawei 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

于 2015-04-18T20:52:18.653 回答