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

C++ FFmpeg how to continue encoding after flushing?

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

avcodec_send_frame(context, NULL);

这是结束流的信号。但是当我向编码器发送一个新帧时,函数 return AVERROR_EOF (man: the encoder has been flushed, and no new frames可以发给它)。 flush后编码器怎么取帧?

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

avcodec_flush_buffers(context);

此函数改变流,但仅用于解码。 也许编码的类比函数?

想法:

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

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

详情: 使用 Win 7、Qt 5.10、ffmpeg 4.0.2

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

B-frames既可以指前帧也可以指后帧,这样的野兽你怎么判断?

从理论上讲,您可能会强制使用关键帧并希望获得最好的结果,但是不启动新上下文确实没有意义,除非 H264 初始化数据的数百字节左右是个问题。