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

C++ C++;FFmpeg刷新后如何继续编码?,c++,qt,ffmpeg,h.264,C++,Qt,Ffmpeg,H.264,我将收到的数据包写入二进制文件。第一个文件的录制完成后,我调用flush: avcodec\u send\u帧(上下文,空) 这是结束流的信号。但是,当我向编码器发送新帧时,函数returnAVERROR\u EOF(男:编码器已刷新,无法向其发送新帧)。冲洗后如何使编码器接收帧 示例:解码时,您可以调用: avcodec\u flush\u缓冲区(上下文) 此函数用于更改流,但仅用于解码。 也许是编码的类比函数 创意: 1) 不要叫同花顺。但是编码器在内部缓冲帧,并仅在刷新后(使用h.264和

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

avcodec\u send\u帧(上下文,空)

这是结束流的信号。但是,当我向编码器发送新帧时,函数returnAVERROR\u EOF(男:编码器已刷新,无法向其发送新帧)。冲洗后如何使编码器接收帧

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

avcodec\u flush\u缓冲区(上下文)

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

创意:

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

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


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

正确的答案是,您应该为每个文件创建一个新的编解码器上下文,否则将随之而来。除非您正在做一些非常奇特的事情,否则额外的标题和关键帧的花费应该很小

B帧既可以指以前的帧,也可以指将来的帧,你会如何决定这样一个怪兽


从理论上讲,您可能会强制执行关键帧并希望达到最佳效果,但如果H264 init数据的数百字节左右是一个问题,那么不启动新的上下文就没有意义了。

正确的答案是您应该为每个文件创建一个新的编解码器上下文,否则就会出现令人头痛的问题。除非您正在做一些非常奇特的事情,否则额外的标题和关键帧的花费应该很小

B帧既可以指以前的帧,也可以指将来的帧,你会如何决定这样一个怪兽


从理论上讲,您可能会强制执行关键帧并希望达到最佳效果,但如果H264 init数据的数百字节左右是一个问题,那么不启动新上下文就没有意义了。

谢谢,Krumelur!我们必须创建一个新的上下文。我只是希望有一个函数可以通过在编码器中发出剩余的数据包来重置上下文。如果你完成了流,你就没有剩余的数据包了。还是我误解了你?编码和解码是一样的:
avcodec\u flush\u buffers(上下文)。之后,您可以开始再次发送数据,而无需任何麻烦。@nice\u pink我认为这可能是错误的。我收到消息“忽略刷新不支持它的编码器的尝试”,连续文件写入的帧似乎重叠。谢谢,Krumelur!我们必须创建一个新的上下文。我只是希望有一个函数可以通过在编码器中发出剩余的数据包来重置上下文。如果你完成了流,你就没有剩余的数据包了。还是我误解了你?编码和解码是一样的:
avcodec\u flush\u buffers(上下文)。之后,您可以开始再次发送数据,而无需任何麻烦。@nice\u pink我认为这可能是错误的。我收到消息“忽略刷新不支持它的编码器的尝试”,连续文件写入的帧似乎重叠。