我有一个 VFR 视频,正在尝试将其所有帧提取为 .jpg。
应用ffprobe -i Video_Stream_0.mp4 -print_format json -loglevel fatal -show_streams -count_frames -select_streams v
显示总共有 7,387 帧:
帧数。
应用ffmpeg -i Video_Stream_0.mp4 -vf vfrdet -an -f null -
告诉我 VFR 有多糟糕:
大量目视飞行规则。
该命令生成的输出可能会为未来的问题提供线索:线索。 让我有点困惑的是,前一行报告的平均帧速率为 6.02 fps,而后一行报告的平均帧速率为 6 fps。
应用ffprobe -show_frames -of compact=p=0 -select_streams v:0 -f lavfi "movie=Video_Stream_0.mp4" > Output_Data.txt 2>&1
聚合所有帧信息。第 66 帧将有问题,尽管我没有看到 pts 或 dts 有任何异常:第 66 帧信息。
第 66 帧的唯一独特之处在于它的持续时间最短,仅为 32 毫秒:第 66 帧持续时间为 32 毫秒。这里我按持续时间对所有帧进行了排序。持续时间最长的帧为 0.504 秒,而大多数帧的持续时间在每帧 1/6 秒左右。
当应用ffmpeg -i Video_Stream_0.mp4 out-%03d.jpg
文件资源管理器时,它说我有一个文件夹,里面有 7,364 个 .jpg,比我预期的少 23 帧。然而文件夹中的第一个文件是 out-001.jpg,最后一个文件是 out-7363.jpg,所以可能有一个重复文件,或者文件资源管理器有问题。在 ffmpeg 输出中可以找到一条线索:框架出口线索。
我们看到 dup=3 和 drop=27。根据此线程:为什么 ffmpeg 和 ffprobe 中的总帧数不同?当两个帧之间的间隔超过 1/FPS 秒时,就会发生重复。查看我的 Excel 文件,我发现有远超 3 个帧的间隔远超 1/6.02 秒/帧,因此这没什么道理。但这些数字加起来是 7,387(预期)- 27(丢失)+ 3(重复)= 7,363 帧。
应用后,ffmpeg -i Video_Stream_0.mp4 -vsync vfr outVFR-%03d.jpg
我得到了 7,359 帧。不知道为什么不是 7,360,因为它不应该重复。
最后,该命令ffmpeg -i Video_Stream_0.mp4 -vsync passthrough outVSYNCPass-%03d.jpg
给我包括第 66 帧在内的所有静止图像,然后退出:转换失败!。
那么,我怎样才能取出全部 7,387 帧呢?
答案1
MJPEG 编码器对于冲突的 PTS 很挑剔。
只需重新定时所有帧。
ffmpeg -i Video_Stream_0.mp4 -vf "settb=AVTB,setpts=N/TB" -fps_mode passthrough out-%03d.jpg