本人最近在做一个可视化工具,可以输入视频文件,对视频文件进行转码转封装,其中需要显示处理进度,本人以视频帧总数为基准进行进度显示,比如文件中视频帧总数为1000时,现在处理到第100帧,此时进度条显示10%。
本人使用AVStream中nb_frames作为视频帧总数,数值为1200,但是本人在一帧一帧读取,解码处理时,最终得到的视频帧数是1199;比1200少1。
为此,本人使用ffprobe探帧命令行测试,得到的结果也是1199,命令行如下:
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 2022-01-08T22-32-58.mp4
本人然后又用ffprobe打印每一帧的具体情况,最终也是1199帧。
问题出在哪里,为此本人调试了ffprobe,关于ffprobe的调试工程搭建,大家可以参看我的博客vs2017调试ffprobe源码
很快,源码调试就是快,本人很快找到了原因,在ffprobe.c里面,有一个函数,如下:
static av_always_inline int process_frame(WriterContext *w,
InputFile *ifile,
AVFrame *frame, AVPacket *pkt,
int *packet_new)
{
AVFormatContext *fmt_ctx = ifile->fmt_ctx;
AVCodecContext *dec_ctx = ifile->streams[pkt->stream_index].dec_ctx;
AVCodecParameters *par = ifile->streams[pkt->stream_ind

作者在开发一个视频可视化工具时遇到帧数不匹配的问题,通过FFprobe发现视频帧数在解码过程中减少1帧。经过源码调试FFmpeg,发现在解码时,只有成功解码的帧才会被计数。最后发现编码时设置AVPacket的duration为0会导致最后一帧无法解码,解决方案是确保duration不设为0。
最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



