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