有谁知道如何使用ffmpeg从视频文件中提取总帧数? ffmpeg的渲染输出显示当前帧,我需要帧计数以百分比计算进度。

最佳答案

注意:MP4 / M4V / M4A / MOV中存在编辑列表会影响您的帧号。请参阅下面的编辑列表。

ffprobe:查询容器

ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
  • 这是一种快速方法。
  • 并非所有格式(例如Matroska)都将报告导致N/A输出的帧数。请参阅下面列出的其他方法。

  • ffprobe:计算帧数
    ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mkv
    
  • 这是一个缓慢的方法。
  • 添加-skip_frame nokey选项以仅计算关键帧。

  • ffmpeg:计算帧数

    如果您没有ffprobe,则可以改用ffmpeg:
    ffmpeg -i input.mkv -map 0:v:0 -c copy -f null -
    
  • 这是一种快速的方法。
  • 请引用控制台输出末尾处的frame=
  • 添加-discard nokey输入选项(在-i之前)以仅计算关键帧。

  • 编辑 list

    使用-ignore_editlist 1输入选项忽略MP4 / M4V / M4A / MOV编辑列表。默认值为,而不是忽略编辑列表。

    ffprobe选项是什么意思
  • -v error这将隐藏“信息”输出(版本信息等),这使解析更加容易。
  • -count_frames计算每个流的帧数,并在相应的流部分中报告。
  • -select_streams v:0仅选择视频流。
  • -show_entries stream=nb_frames-show_entries stream=nb_read_frames仅显示nb_framesnb_read_frames的条目。
  • -of default=nokey=1:noprint_wrappers=1将输出格式(也称为“writer”)设置为default,不打印每个字段的键(nokey=1),也不打印节的页眉和页脚(noprint_wrappers=1)。有更短的选择,例如-of csv=p=0

  • 另见
  • FFprobe Documentation
  • FFmpeg Wiki: FFprobe Tips


  • 媒体信息

    众所周知的mediainfo工具可以输出帧数:
    mediainfo --Output="Video;%FrameCount%" input.avi
    

    MP4盒

    对于MP4 / M4V / M4A文件。

    来自gpac的MP4Box可以显示帧数:
    MP4Box -info input.mp4
    

    请引用输出中有关视频流的Media Info行:
    Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples
    

    在此示例中,视频流具有2525帧。

    翻斗车

    对于MP4 / M4V / M4A / MOV文件。
    boxdumper是l-smash中的简单工具。它将输出大量信息。在stsz样本大小框部分下,请参阅sample_count以获取帧数。在此示例中,输入具有1900个视频帧:
    boxdumper input.mp4
      ...
      [stsz: Sample Size Box]
        position = 342641
        size = 7620
        version = 0
        flags = 0x000000
        sample_size = 0 (variable)
        sample_count = 1900
    
  • 请注意,一个文件可能包含多个stsz原子。
  • 10-08 08:51