android - ExoPlayer 无法在使用 FFMPEG 的设备上播放音频

标签 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 类型。如果我传入磁盘上本地版本的完全相同的文件,它会播放得很好,只是如果它在服务器上就不行了。 FFMPEG 似乎不理解 MIME 是什么,而是使用它自己的 SCSS “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"作为 header 传入,但它什么也没做。

最佳答案

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

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

关于android - ExoPlayer 无法在使用 FFMPEG 的设备上播放音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26902670/

相关文章:

适用于应用程序的基于 Android Tile 的 UI

android - 如何在同一个按钮上显示/隐藏按钮单击

android - 如何重新定位 Jetpack-media3/exoplayer 控制按钮?

支持 MPEG-DASH 的 Android 媒体播放器

android - 如何使用 exoplayer 流式传输 rtsp url?

java - 有时在 exoplayer 中的视频缓冲速度很慢?

java - 重复使用相同的 Activity

Android Studio Profiler 显示空 Activity 的内存使用量为 100 MB

android - 在Cordova中基于解析电话的登录

android - ExoPlayer 使用自定义的 MediaCodecSelector