![为什么 ffmpeg 和 ffprobe 中的总帧数不同?](https://linux22.com/image/1612608/%E4%B8%BA%E4%BB%80%E4%B9%88%20ffmpeg%20%E5%92%8C%20ffprobe%20%E4%B8%AD%E7%9A%84%E6%80%BB%E5%B8%A7%E6%95%B0%E4%B8%8D%E5%90%8C%EF%BC%9F.png)
我想要视频的总帧数,以便使用以下 ffprobe 命令:
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=noprint_wrappers=1 100P.mp4
我得到下面的输出
在上面的输出中我得到559 frames
然后我使用相同的视频在其上添加水印并使用以下命令:
ffmpeg -i 100P.mp4 -i mt.png -filter_complex "overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" -codec:a copy -preset ultrafast output.mp4
我得到如下输出:
在上图中,添加水印后我得到605 frames
所以我的问题是为什么我在 ffmpeg 和 ffprobe 中获得不同的帧数?
答案1
FFmpeg 默认为 MP4 输出设置恒定帧速率模式。当输入流为 VFR 时,ffmpeg 将复制或丢弃帧以生成 CFR 流。在输出统计信息中,在 的右侧frame=605
,您可以看到dup=46
,这表明 ffmpeg 添加了 46 个重复帧。简而言之,当两个输入帧之间的间隔大于1/FPS
秒时就会发生这种情况,其中 FPS 表示输出帧速率。如果用户未明确设置,则输出帧速率设置为检测到的输入帧速率(值tbr
)。
添加-vsync vfr
以防止帧重复。