为什么 ffmpeg 中的总帧数与 ffprobe 不同?

Mil*_*ani 9 ffmpeg

我想要视频的总帧数,以便我使用以下 ffprobe 命令:

ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=noprint_wrappers=1 100P.mp4
Run Code Online (Sandbox Code Playgroud)

我在下面得到输出

ffprobe 的输出

在上面的输出中我得到 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
Run Code Online (Sandbox Code Playgroud)

我得到这样的输出:

ffmpeg 的输出

在上图中,添加水印后我得到 605 frames

所以我的问题是为什么我在 ffmpeg 和 ffprobe 中得到不同的帧数?

Gya*_*yan 23

默认情况下,FFmpeg 为 MP4 输出设置恒定帧速率模式。当输入流为 VFR 时,ffmpeg 会复制或丢帧生成 CFR 流。在输出统计信息中,在 的右侧frame=605,您可以看到dup=46,这表明 ffmpeg 添加了 46 个重复帧。简短的版本是当两个输入帧相距超过1/FPS秒时会发生这种情况,其中 FPS 表示输出帧速率。tbr如果用户未明确设置,则输出帧率将设置为检测到的输入帧率(值)。

添加-vsync vfr以防止帧重复。

  • 您不应该使用`-vsync passthrough`来获取ffprobe报告的确切帧数吗? (4认同)
  • 每当您设置 `-vsync vfr`(并且您几乎总是想设置它)时,您可能还想设置 `-enc_time_base -1`,否则 ffmpeg 会搞砸演示时间戳。 (2认同)