ffmpeg `AVCodecContext`的`frame_number`字段查看解码器是否正在产生输出帧

简介: ffmpeg `AVCodecContext`的`frame_number`字段查看解码器是否正在产生输出帧
/**
     * 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字段变化的图表:

在这个图表中:

  1. avcodec_send_packet函数发送一个数据包到AVCodecContext
  2. AVCodecContext更新frame_number字段。
  3. avcodec_receive_frame函数从AVCodecContext接收一个帧。
  4. AVCodecContext再次更新frame_number字段。

这个过程会在处理音视频数据时反复进行,frame_number字段会随着每个处理的帧而增加。


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

目录
相关文章
|
11天前
|
算法 数据处理 开发者
FFmpeg库的使用与深度解析:解码音频流流程
FFmpeg库的使用与深度解析:解码音频流流程
44 0
|
11天前
|
存储 编解码 数据处理
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码(三)
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码
53 0
|
11天前
|
存储 编解码 数据处理
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码(二)
【FFmpeg 视频基本格式】深入理解FFmpeg:从YUV到PCM,解码到编码
53 0
|
11天前
|
存储 编解码 调度
剖析ffmpeg视频解码播放:时间戳的处理
剖析ffmpeg视频解码播放:时间戳的处理
79 0
|
11天前
|
编解码 算法 vr&ar
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换(二)
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换
57 1
|
11天前
|
存储 编解码 算法
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换(一)
深度剖析FFmpeg视频解码后的帧处理到Qt显示 从AVFrame到QImage的转换
101 1
|
11天前
|
安全 数据处理 数据格式
深入浅出:FFmpeg 音频解码与处理AVFrame全解析(三)
深入浅出:FFmpeg 音频解码与处理AVFrame全解析
58 0
|
7天前
|
编解码 Linux 5G
FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器
AVS3,中国制定的第三代音视频标准,是首个针对8K和5G的视频编码标准,相比AVS2和HEVC性能提升约30%。uavs3d是AVS3的解码器,支持8K/60P实时解码,且在各平台有优秀表现。要为FFmpeg集成AVS3解码器libuavs3d,需从GitHub下载最新源码,解压后配置、编译和安装。之后,重新配置FFmpeg,启用libuavs3d并编译安装,通过`ffmpeg -version`确认成功集成。
21 0
FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器
|
8天前
|
存储 缓存 调度
FFmpeg开发笔记(十九)FFmpeg开启两个线程分别解码音视频
《FFmpeg开发实战》第10章示例playsync.c在处理音频流和视频流交错的文件时能实现同步播放,但对于分开存储的格式,会出现先播放全部声音再快速播放视频的问题。为解决此问题,需改造程序,增加音频处理线程和队列,以及相关锁,先将音视频帧读入缓存,再按时间戳播放。改造包括声明新变量、初始化线程和锁、修改数据包处理方式等。代码修改后在playsync2.c中,编译运行成功,控制台显示日志,SDL窗口播放视频并同步音频,证明改造有效。
17 0
FFmpeg开发笔记(十九)FFmpeg开启两个线程分别解码音视频
|
11天前
|
存储 编解码 编译器
FFmpeg 7.0 正式登场:全新 VVC 解码器
【4月更文挑战第9天】最新版本的流行视频处理软件FFmpeg 7.0,代号为“Dijkstra”,已正式发布。
56 0