使用NDK / C ++ / MediaCodec的自定义播放器 - 解码器

时间:2018-04-10 18:43:55

标签: android-ndk codec mediacodec qualcomm

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

我正在运行基于NDK / C ++ / CMake工具链的自定义电影播放器​​,它打开流媒体URL(mp4,H.264和立体声音频)。为了从给定位置重新开始,播放器打开流,将帧缓冲到一定长度,然后寻找新位置并开始解码和播放。除非我们对设备进行电源循环并按照相同的步骤进行操作,否则此操作始终正常。

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

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

  

修改 - 更多信息(4/23)

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

我的播放器基于MediaCodec的NDK / C ++接口,CMake构建传递-DANDROID_ABI="armeabi-v7a with NEON"-DANDROID_NATIVE_API_LEVEL="android-22" \以及C ++ _ static。

任何人都可以分享他们使用过的超时时间,并找到成功或有助于避免饥饿或缓冲的任何事情?

1 个答案:

答案 0 :(得分:0)

现在已经解决了。饥饿并非由解码视角引起,但由于返回的时钟值不同步,因此图像的消耗速度更快。我使用clock_gettime方法CLOCK_MONOTONIC时钟ID,这是推荐的方式,但重启设备的前5-10分钟总是更快。此设备仅具有Wi-Fi连接。将时钟ID更改为CLOCK_REALTIME可确保正确显示图像并且不会出现饥饿。