/** * Frame counter, set by libavcodec. * * - decoding: total number of frames returned from the decoder so far. * - encoding: total number of frames passed to the encoder so far. * * @note the counter is not incremented if encoding/decoding resulted in * an error. */ int frame_number;
这是一个表示ffmpeg音视频界面过程接口调用中AVCodecContext的frame_number字段变化的图表:
在这个图表中:
avcodec_send_packet
函数发送一个数据包到AVCodecContext
。AVCodecContext
更新frame_number
字段。avcodec_receive_frame
函数从AVCodecContext
接收一个帧。AVCodecContext
再次更新frame_number
字段。
这个过程会在处理音视频数据时反复进行,frame_number
字段会随着每个处理的帧而增加。
AVCodecContext
的frame_number
字段表示已经解码的帧数。在调用avcodec_receive_frame
之后检查这个字段可能是有意义的,因为这个函数是用来从解码器中获取解码后的帧的。
在你发送一个新的AVPacket
给解码器(通过调用avcodec_send_packet
)之后,解码器可能会立即解码这个包,也可能会等待更多的数据。因此,在avcodec_send_packet
之后检查frame_number
可能不会立即反映出新的解码帧。
然而,在avcodec_receive_frame
返回之后,如果解码器已经成功解码出一个新的帧,那么frame_number
应该会增加。因此,你可以在调用avcodec_receive_frame
之后检查frame_number
,以确认解码器是否正在产生新的输出帧。
请注意,frame_number
只是一个粗略的指标,它可能不会反映出所有的解码活动。例如,解码器可能在内部缓冲多个解码帧,而这些帧还没有通过avcodec_receive_frame
返回。因此,即使frame_number
没有增加,解码器也可能正在正常工作。
frame_number
字段在AVCodecContext
结构体初始化时默认为0。这个字段表示已经从解码器成功接收的帧数。
当avcodec_receive_frame
返回EAGAIN
时,这意味着解码器需要更多的输入数据才能产生输出。在这种情况下,frame_number
字段通常不会增加,因为没有新的帧被成功接收。
你的理解是正确的。如果avcodec_receive_frame
没有成功返回一个新的帧(例如,它返回了EAGAIN
),那么frame_number
通常不会变化。只有当avcodec_receive_frame
成功返回一个新的帧时,frame_number
才会增加。
请注意,frame_number
只是一个粗略的指标,它可能不会反映出所有的解码活动。例如,解码器可能在内部缓冲多个解码帧,而这些帧还没有通过avcodec_receive_frame
返回。因此,即使frame_number
没有增加,解码器也可能正在正常工作。