如何降低 MediaCodec H264 编码器的延迟?

4
我正在尝试使用Android 6.0的MediaCodec将H264实时编码成流,并实现低延迟。从编码器中有大约6帧的延迟,我想知道如何减少。
代码来自screenrecord.cpp
部分代码如下:
while (true) {
     encoder->dequeueOutputBuffer(&bufIndex);
}

编码器以320x480 60 fps的屏幕表面为输入,并通过dequeueOutputBuffer()输出流数据。大约有6帧被送到编码器,其数据不会立即由dequeueOutputBuffer()返回。换句话说,当第N帧被输入时,编码器输出第(N-6)帧的数据。
问题1 - 如何减少在编码器中缓冲的帧数?是否可能在第N帧被输入后立即输出第N帧?
附注:问题1与此问题相同。(目前没有好的解决方案)
当表面图形内容突然变得静态时,不再向编码器提供更多帧。奇怪的是,最新的6帧数据不能按照它们的“正常速度”输出,它们在大约10秒钟内缓慢地输出。
问题2 - 如何在突然停止向编码器提供数据时减少最新帧的延迟输出?
1个回答

2

视频的缓冲由视频编码器决定。除了选择不会表现出这种行为的视频编码器之外,我认为你无法做太多事情。

如果您不想输出暂停,最简单的解决方法是不要暂停输入。继续提供相同的帧。编码器应该能够识别到没有变化并且生成非常少的输出。screenrecord不是这样工作的-它只是在收到帧后提交它们-因此您需要添加一个超时来重新提交帧。


我正在尝试通过循环将先前的样本输入,直到我从源中获取到另一个样本并传递给我的MediaFoundation h264硬件编码器进行相同的操作。这样生成的输出速度更快(几乎实时),但生成的样本比我预期的要大得多(尽管没有任何变化,大小约为300KB,配置了比特率4000000(500KB))。 - iamrameshkumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接