我正在尝试使用 Android6.0 的 MediaCodec 将 h264 实时低延迟编码为流。
编码器大约有 6 帧延迟,我想知道如何减少
代码来自屏幕记录.cpp https://android.googlesource.com/platform/frameworks/av/+/master/cmds/screenrecord/screenrecord.cpp
零件代码为:
while (true) {
encoder->dequeueOutputBuffer(&bufIndex);
}
编码器以 320x480 60 fps 的速度由屏幕 Surface 馈送,并通过 dequeueOutputBuffer() 输出流数据。
大约有 6 个帧馈送至编码器,其数据不会通过 dequeueOutputBuffer() 立即返回。
换句话说,当馈送第N帧时,编码器输出第(N-6)帧的数据。
问题 1 - 如何减少编码器中缓冲的帧?是否可以在第 N 帧输入编码器后立即输出第 N 帧?
PS:问题1同理这个问题 https://stackoverflow.com/questions/16323041/android-mediacodec-real-time-decoding-h264-nals.(还没有好的解决方案)。
当表面图形内容突然变成静态时,不再有帧被馈送到编码器。奇怪的是,最新的6帧数据无法以“正常速度”输出,大约10秒左右才慢慢输出。
问题 2 - 当突然没有数据馈送到编码器时,如何减少最新帧输出的延迟?
缓冲由视频编码器决定。我认为除了选择不这样做的视频编码器之外,您对此无能为力。
如果您不想暂停输出,最简单的解决方法是不暂停输入。继续输入相同的帧。编码器应该识别出没有任何变化并生成很少的输出。 screenrecord 不是这样工作的——它只是在获取帧时提交帧——所以你必须添加一个重新提交帧的超时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)