/** * 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没有增加,解码器也可能正在正常工作。