我有一个非常有趣的问题。
我正在运行基于 NDK/C++/CMake 工具链的自定义电影播放器,该工具链会打开流 URL(mp4、H.264 和立体声音频)。为了从给定位置重新开始,播放器打开流,将帧缓冲到一定长度,然后寻找新位置并开始解码和播放。除非我们重新启动设备并遵循相同的步骤,否则这一直都可以正常工作。
这在少数版本的软件(针对 android-22..26 的插件构建)和硬件(LG G6、G5 和 LeEco)上重现。如果您将应用程序打开 10 分钟,则不会发生此问题。
我正在寻找可能的关注领域。我玩过解码逻辑(它基于描述为使用缓冲区进行同步处理的方法)。
编辑 - 更多信息 (4/23)
我修改了播放器以选择一个流,然后只播放视频而不是视频+音频。这导致持续的饥饿导致缓冲。这似乎在 android 版本中发生了变化(这里没有修复数据)。我确实相信我遇到了解码器饥饿。以前,我将 和 的超时设置为 0 AMediaCodec_dequeueInputBuffer
,AMediaCodec_dequeueOutputBuffer
我在输入端将其更改为 1000 和 10000,但没有太大区别。
我的播放器基于与 MediaCodec、CMake 构建通道和 C++_static 的 NDK/C++-DANDROID_ABI="armeabi-v7a with NEON"
接口-DANDROID_NATIVE_API_LEVEL="android-22" \
。
任何人都可以分享他们使用过的超时时间并获得了成功,或者任何有助于避免饥饿或由此产生的缓冲的东西?