我正在尝试使用Android6.0的MediaCodec将h264编码为实时低延迟流。 编码器有大约6帧的延迟,我想知道如何减少
代码来自screenrecord.cpp
部分代码是:
while (true) {
encoder->dequeueOutputBuffer(&bufIndex);
}
编码器由屏幕的Surface以320x480 60 fps提供,并通过dequeueOutputBuffer()输出流数据。 编码器大约有6帧,其数据不会由dequeueOutputBuffer()立即返回。 换句话说,当第N帧被馈送时,编码器输出第(N-6)帧的数据。
问题1 - 如何减少编码器中缓冲的帧?在第N帧被送入编码器后,是否可以输出第N帧?
PS:问题1与this question相同。(还没有好的解决方案)。
当表面图形内容突然变为静态时,不再向编码器提供帧。奇怪的是,最新的6帧数据无法以“通常的速度”输出,它们会在大约10秒内缓慢输出。
问题2 - 当突然没有数据馈送到编码器时,如何减少最新帧输出的延迟?
答案 0 :(得分:1)
缓冲由视频编码器确定。除了选择不这样做的视频编码器之外,我认为你无法做到这一点。
如果您不希望输出暂停,最简单的解决方法是不暂停输入。继续输入相同的帧。编码器应该识别出没有任何变化并产生很少的输出。 screenrecord不会以这种方式工作 - 它只是在获取帧时提交帧 - 所以你必须添加一个重新提交帧的超时。