如何减少 MediaCodec H264 编码器延迟
how to reduce MediaCodec H264 encoder latency
我正在尝试使用 Android6.0 的 MediaCodec 将 h264 编码为实时低延迟流。
编码器大约有 6 帧延迟,我想知道如何减少
代码来自screenrecord.cpp
零件编码为:
while (true) {
encoder->dequeueOutputBuffer(&bufIndex);
}
编码器以 320x480 60 fps 的屏幕表面为输入,并通过 dequeueOutputBuffer() 输出流数据。
dequeueOutputBuffer() 立即将大约 6 帧馈送到其数据未 return 的编码器。
换句话说,当第N帧被馈送时,编码器输出第(N-6)帧的数据。
问题 1 - 如何减少编码器中缓冲的帧数?是否可以在第 N 帧输入编码器后立即输出第 N 帧?
PS: 问题1同this question.(暂时没有好的解决方法).
当表面图形内容突然变为静态时,不再向编码器提供帧。奇怪的是最新的6帧数据无法在上面输出"usual speed",大约10秒后才慢慢输出。
问题 2 - 如何在编码器突然没有数据馈送时减少最新帧输出的延迟?
缓冲由视频编码器决定。我认为除了 select 不以这种方式运行的视频编码器之外,您无能为力。
如果您不想暂停输出,最简单的解决方法是不暂停输入。继续输入相同的帧。编码器应该认识到没有任何变化并生成非常少的输出。 screenrecord 不能以这种方式工作——它只是在获取帧时提交帧——所以你必须添加一个 re-submits 帧的超时。
我正在尝试使用 Android6.0 的 MediaCodec 将 h264 编码为实时低延迟流。 编码器大约有 6 帧延迟,我想知道如何减少
代码来自screenrecord.cpp
零件编码为:
while (true) {
encoder->dequeueOutputBuffer(&bufIndex);
}
编码器以 320x480 60 fps 的屏幕表面为输入,并通过 dequeueOutputBuffer() 输出流数据。 dequeueOutputBuffer() 立即将大约 6 帧馈送到其数据未 return 的编码器。 换句话说,当第N帧被馈送时,编码器输出第(N-6)帧的数据。
问题 1 - 如何减少编码器中缓冲的帧数?是否可以在第 N 帧输入编码器后立即输出第 N 帧?
PS: 问题1同this question.(暂时没有好的解决方法).
当表面图形内容突然变为静态时,不再向编码器提供帧。奇怪的是最新的6帧数据无法在上面输出"usual speed",大约10秒后才慢慢输出。
问题 2 - 如何在编码器突然没有数据馈送时减少最新帧输出的延迟?
缓冲由视频编码器决定。我认为除了 select 不以这种方式运行的视频编码器之外,您无能为力。
如果您不想暂停输出,最简单的解决方法是不暂停输入。继续输入相同的帧。编码器应该认识到没有任何变化并生成非常少的输出。 screenrecord 不能以这种方式工作——它只是在获取帧时提交帧——所以你必须添加一个 re-submits 帧的超时。