C++ FFmpeg 刷新后如何继续编码?

标签 c++ qt ffmpeg h.264

我将接收到的数据包写入二进制文件。当第一个文件的录制完成后,我调用 flush:

avcodec_send_frame(context, NULL);

这是结束流的信号。但是当我向编码器发送一个新帧时,函数返回 AVERROR_EOF (伙计:编码器已被刷新,无法向其发送新帧)。如何使编码器在刷新后取帧?

示例:解码时,可以调用:

avcodec_flush_buffers(context);

这个函数改变流,但只用于解码。 也许编码的类比函数?

想法:

1) 不要调用flush。但是编码器在内部缓冲帧并仅在刷新(使用带 b 帧的 h.264) 后提供一些数据包,而一些数据包进入下一个文件。

2) 重新创建编解码器上下文?

详细信息:使用 Win 7、Qt 5.10、ffmpeg 4.0.2

最佳答案

正确的答案是您应该为每个文件创建一个新的编解码器上下文,否则会很头疼。额外的 header 和关键帧的小开销应该很小,除非你正在做一些非常奇特的事情。

B 帧既可以指代之前的帧也可以指代 future 的帧,您如何判断这样的野兽?

理论上,您可能会强制设置一个关键帧并希望获得最好的结果,但是如果不开始一个新的上下文真的没有意义,除非 H264 初始化数据的数百字节左右是个问题。

关于C++ FFmpeg 刷新后如何继续编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53004170/

相关文章:

c++ - 有没有没有依赖的归档库? (C/C++)

c++ - 以下哪个执行得更快?

c++ - 像 C 的 printf 一样向 QTextEdit 显示格式化文本

c++ - 如何使用 QSettings 向我的配置文件添加注释?

覆盖后的FFmpeg concat(附加)

linux - 将包含空格的字符串传递给脚本

c++ - std::pair 和 visual studio 2010 中的自动替换

c++ - Qt designer -- set style sheet -- hardcoded now -- 想以编程方式设置

ffmpeg - HTML5 H264 视频有时不显示

c++ - 闭合贝塞尔曲线