You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg 5 C API编解码:接收端最多返回几次EOF?

FFmpeg Send/Receive编解码API流结束场景疑问

编辑说明:最初的问题表述可能不够清晰,现已重新撰写,若之前造成困惑深表歉意。

我是FFmpeg API编程新手(使用5.1版本),正在通过文档和官方示例学习。

在FFmpeg 5.1版本的send/receive编解码API概述文档中,简要讨论了流结束场景:

流结束场景:此类情况需要“刷新”(即排空)编解码器,因为编解码器可能为了性能或必要原因(比如B帧)在内部缓冲多个帧或数据包。处理方式如下:

向avcodec_send_packet()(解码)或avcodec_send_frame()(编码)函数传入NULL替代有效输入,这将进入排空模式。循环调用avcodec_receive_frame()(解码)或avcodec_receive_packet()(编码)直到返回AVERROR_EOF。除非未进入排空模式,否则这些函数不会返回AVERROR(EAGAIN)。恢复解码前,必须调用avcodec_flush_buffers()重置编解码器。

我的理解是:当收到AVERROR_EOF时,需要排空编解码器的缓冲数据,最终用avcodec_flush_buffers()重置,否则无法继续编解码。这个理解是否正确?

若正确,我有以下问题:

  • 在一次完整的处理流程(比如解码)中,接收端最多会返回几次EOF?
  • 若第一个问题的答案是无限次,那么当我已完成数据发送(比如av_read_frame()返回EOF后)收到接收端的EOF时,如何判断是否真的处理完成?目前没有专门的返回码指示接收完成。
  • 排空模式下receive_...函数返回的数据是否有效?

我可能在官方示例中找到了答案,但不确定是否具有通用性。我注意到部分官方示例(如transcode_aac.c)仅在首次收到EOF时进行排空,第二次收到EOF则认为确实无数据剩余,排空期间收到的数据也会写入最终输出。

我对该示例的解读是否正确?若正确,是否可以认为问题1的答案是1次,问题3的答案是“是”?

提前感谢您的回复与时间。:)

内容的提问来源于stack exchange,提问作者Guanyuming He

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:43:24