0

我有一个非常有趣的问题。

我正在运行基于 NDK/C++/CMake 工具链的自定义电影播放器​​,该工具链会打开流 URL(mp4、H.264 和立体声音频)。为了从给定位置重新开始,播放器打开流,将帧缓冲到一定长度,然后寻找新位置并开始解码和播放。除非我们重新启动设备并遵循相同的步骤,否则这一直都可以正常工作。

这在少数版本的软件(针对 android-22..26 的插件构建)和硬件(LG G6、G5 和 LeEco)上重现。如果您将应用程序打开 10 分钟,则不会发生此问题。

我正在寻找可能的关注领域。我玩过解码逻辑(它基于描述为使用缓冲区进行同步处理的方法)。

编辑 - 更多信息 (4/23)

我修改了播放器以选择一个流,然后只播放视频而不是视频+音频。这导致持续的饥饿导致缓冲。这似乎在 android 版本中发生了变化(这里没有修复数据)。我确实相信我遇到了解码器饥饿。以前,我将 和 的超时设置为 0 AMediaCodec_dequeueInputBufferAMediaCodec_dequeueOutputBuffer我在输入端将其更改为 1000 和 10000,但没有太大区别。

我的播放器基于与 MediaCodec、CMake 构建通道和 C++_static 的 NDK/C++-DANDROID_ABI="armeabi-v7a with NEON"接口-DANDROID_NATIVE_API_LEVEL="android-22" \

任何人都可以分享他们使用过的超时时间并获得了成功,或者任何有助于避免饥饿或由此产生的缓冲的东西?

4

1 回答 1

0

暂时解决了这个问题。从解码的角度来看,饥饿不是造成的,但由于返回的时钟值不同步,图像的消耗速度更快。我使用的是clock_gettime带有CLOCK_MONOTONIC时钟 ID 的方法,这是推荐的方法,但在重新启动设备的前 5-10 分钟内总是更快。此设备只有 Wi-Fi 连接。更改时钟 ID 以CLOCK_REALTIME确保正确显示图像并且不会出现饥饿。

于 2018-05-01T20:15:55.620 回答