我有一个非常有趣的问题。
我正在运行基于NDK / C ++ / CMake工具链的自定义电影播放器,它打开流媒体URL(mp4,H.264和立体声音频)。为了从给定位置重新开始,播放器打开流,将帧缓冲到一定长度,然后寻找新位置并开始解码和播放。除非我们对设备进行电源循环并按照相同的步骤进行操作,否则此操作始终正常。
这是在少数版本的软件(针对android-22..26的插件构建)和硬件(LG G6,G5和LeEco)上复制的。如果您将应用程序保持打开10分钟,则不会发生此问题。
我正在寻找可能的关注领域。我使用了解码逻辑(它基于使用缓冲区描述为同步处理的方法)。
修改 - 更多信息(4/23)
我修改了播放器以选择一个流,然后只播放视频而不是视频+音频。这导致持续的饥饿导致缓冲。这似乎已经在Android版本中发生了变化(这里没有修复数据)。我相信我遇到了解码器饥饿。以前,我为AMediaCodec_dequeueInputBuffer
和AMediaCodec_dequeueOutputBuffer
设置了0的超时,我在输入端将其更改为1000和10000,但没有太大区别。
我的播放器基于MediaCodec的NDK / C ++接口,CMake构建传递-DANDROID_ABI="armeabi-v7a with NEON"
和-DANDROID_NATIVE_API_LEVEL="android-22" \
以及C ++ _ static。
任何人都可以分享他们使用过的超时时间,并找到成功或有助于避免饥饿或缓冲的任何事情?
答案 0 :(得分:0)
现在已经解决了。饥饿并非由解码视角引起,但由于返回的时钟值不同步,因此图像的消耗速度更快。我使用clock_gettime
方法CLOCK_MONOTONIC
时钟ID,这是推荐的方式,但重启设备的前5-10分钟总是更快。此设备仅具有Wi-Fi连接。将时钟ID更改为CLOCK_REALTIME
可确保正确显示图像并且不会出现饥饿。