如何使用ffprobe

使用ffprobe非常简单。你所要做的就是在命令行上调用它,并将它指向你的视频,如下所示:

$ ffprobe 1.mp4
ffprobe version 5.0-full_build-www.gyan.dev Copyright (c) 2007-2022 the FFmpeg developers
  built with gcc 11.2.0 (Rev5, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 2022-09-28T07:41:56.000000Z
  Duration: 00:01:11.56, start: 0.000000, bitrate: 2196 kb/s
  Stream #0:0[0x1](und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080, 2119 kb/s, 17.73 fps, 1k tbr, 1k tbn (default)
    Metadata:
      creation_time   : 2022-09-28T07:41:56.000000Z
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: pcm_mulaw (ulaw / 0x77616C75), 8000 Hz, 1 channels, s16, 64 kb/s (default)
    Metadata:
      creation_time   : 2022-09-28T07:41:56.000000Z
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:2[0x3](und): Audio: aac (LC) (mp4a / 0x6134706D), 8000 Hz, mono, fltp, 60 kb/s (default)
    Metadata:
      creation_time   : 2022-09-28T07:41:56.000000Z
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]

从输出中可以看到,ffprobe提供了大量关于视频的高级信息。它告诉你你的视频包含多少流,视频和音频流的数量,编解码细节,帧率,持续时间等。

记住,这些信息是非常高级的,在以后的部分中,我们将学习如何更深入地使用ffprobe获取框架级别的信息。

如何隐藏ffprobe banner信息

如果您只想从ffprobe获取某些信息,那么您打印的所有关于FFmpeg的信息(版本信息、构建设置等)可能会非常烦人。幸运的是,有一个选项可以防止ffprobe打印所有这些信息,称为“banner”。你可以这样做:

$ ffprobe -hide_banner .\1.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 2022-09-28T07:41:56.000000Z
  Duration: 00:01:11.56, start: 0.000000, bitrate: 2196 kb/s
  Stream #0:0[0x1](und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080, 2119 kb/s, 17.73 fps, 1k tbr, 1k tbn (default)
    Metadata:
      creation_time   : 2022-09-28T07:41:56.000000Z
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: pcm_mulaw (ulaw / 0x77616C75), 8000 Hz, 1 channels, s16, 64 kb/s (default)
    Metadata:
      creation_time   : 2022-09-28T07:41:56.000000Z
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:2[0x3](und): Audio: aac (LC) (mp4a / 0x6134706D), 8000 Hz, mono, fltp, 60 kb/s (default)
    Metadata:
      creation_time   : 2022-09-28T07:41:56.000000Z
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]

这是启用hide_banner选项后的输出结果。在没有关于FFmpeg和用于构建它的构建选项的所有信息的情况下,阅读起来要容易得多。

你想摆脱更多的信息吗?是否要删除关于Input、元数据、持续时间等的所有信息?

然后您可以指定-v error或-v panic,这将进一步减少打印在屏幕上的信息。如果我必须对信息进行后期处理或将其写入脚本,而不需要不必要的文本,我就经常使用这种方法。

$ ffprobe crowdruncrf35.mp4 -hide_banner -v panic

很好,现在让我们看一下输出,了解一下可以获得输出的不同格式。

Stream Specifiers in ffprobe

经常会遇到包含多个视频和音频流的视频文件(例如,多种语言)。现在,让我们假设您想要检查音轨,您如何使用ffprobe来做到这一点?让我们学习!

如我们的1.mp4有一个视频流和两个音频流

如果我们只想检查音频流,就需要向ffprobe提供一个流说明符,并告诉它只提供关于音频流的数据。您可以使用-select_streams说明符,如下所示。通过提到a:0,我们告诉ffprobe检查index = 1的音频流。

$ ffprobe -hide_banner -v panic -select_streams v:0 -show_entries stream=bit_rate 1.mp4
[STREAM]
bit_rate=2119734
[/STREAM]

如何隐藏[STREAM]和[/STREAM]

如果查看ffprobe的输出,它会在包装器[STREAM]和[/STREAM]中提供信息。要消除这种情况,需要在命令行中指定以下内容

noprint_wrappers=1

现在,让我们测试前面的命令行并查看输出:

$ ffprobe -v error -hide_banner -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1 1.mp4
bit_rate=2119734

正如你所看到的,ffprobe只打印了视频流的比特率,而没有[STREAM]!

如何使用ffprobe提取流信息,包,帧,和容器格式?

如您所知,ffprobe可以提供关于输入视频的每个流、包和帧的大量信息。要访问此信息,必须在命令行中指定以下命令:

  • :获取每个流的信息。
  • :获取容器格式。
  • :获取每个包信息。
  • :获取每个帧信息。

使用ffprobe获取每个流信息

让我们使用-show_streams说明符获取所有流的信息。

 ffprobe -v error -hide_banner -select_streams v:0 -show_streams 1.mp4
[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=Constrained Baseline
codec_type=video
codec_tag_string=avc1
codec_tag=0x31637661
width=1920
height=1080
coded_width=1920
coded_height=1080
closed_captions=0
film_grain=0
has_b_frames=0
sample_aspect_ratio=N/A
display_aspect_ratio=N/A
pix_fmt=yuv420p
level=42
color_range=unknown
color_space=unknown
color_transfer=unknown
color_primaries=unknown
chroma_location=left
field_order=progressive
refs=1
is_avc=true
nal_length_size=4
id=0x1
r_frame_rate=1000/1
avg_frame_rate=124700/7033
time_base=1/1000
start_pts=0
start_time=0.000000
duration_ts=70330
duration=70.330000
bit_rate=2119734
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=1247
nb_read_frames=N/A
nb_read_packets=N/A
extradata_size=31
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
DISPOSITION:captions=0
DISPOSITION:descriptions=0
DISPOSITION:metadata=0
DISPOSITION:dependent=0
DISPOSITION:still_image=0
TAG:creation_time=2022-09-28T07:41:56.000000Z
TAG:language=und
TAG:handler_name=VideoHandler
TAG:vendor_id=[0][0][0][0]
[/STREAM]

输出包含流级别的大量重要信息。你可以检查高度,宽度,帧率,比特率,大小,编解码器,编解码器级别和配置文件,像素格式,b帧的存在,等等。

不如我们再深入一层,按每个数据包获取信息?

使用ffprobe获取每个包信息

使用以下命令,您可以获取视频中每个包的信息,即使用。出于演示目的,我只展示了其中一个包。如您所见,它包含关于pts、dts、持续时间、大小等的详细信息。

$ ffprobe -v error -hide_banner -select_streams v:0 -show_packets 1.mp4
...
[PACKET]
codec_type=video
stream_index=0
pts=66615
pts_time=66.615000
dts=66615
dts_time=66.615000
duration=70
duration_time=0.070000
size=20690
pos=18222915
flags=__
[/PACKET]
...

接下来让我们深入了解每个帧:

使用ffporbe获取每个帧信息

现在,让我们使用-show_frames命令获取每一帧视频的信息。输出包含大量信息——时间戳、宽度、高度、像素格式、图片类型(I、P、B)、按显示顺序和解码顺序排列的图片编号、颜色空间、图片是否交错,如果是交错的——它是顶部字段优先还是底部字段优先?帧是关键帧吗?在一个框架级别上有大量的信息,对吧?

$ ffprobe -v error -hide_banner -select_streams v:0 -show_frames 1.mp4
...
[/FRAME]
[FRAME]
media_type=video
stream_index=0
key_frame=0
pts=58
pts_time=0.058000
pkt_dts=58
pkt_dts_time=0.058000
best_effort_timestamp=58
best_effort_timestamp_time=0.058000
pkt_duration=1
pkt_duration_time=0.001000
pkt_pos=398620
pkt_size=6074
width=1920
height=1080
pix_fmt=yuv420p
sample_aspect_ratio=N/A
pict_type=P
coded_picture_number=58
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
color_range=unknown
color_space=unknown
color_primaries=unknown
color_transfer=unknown
chroma_location=left
[/FRAME]
...

使用ffprobe获取容器信息

您还可以通过命令行中的-show_format选项,使用ffprobe获取有关容器格式的信息。正如您所看到的,它包含了关于容器的所有信息、持续时间、大小、比特率以及容器附带的任何标记。

$ ffprobe -v error -hide_banner -select_streams v:0 -show_format 1.mp4
[FORMAT]
filename=1.mp4
nb_streams=3
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=71.563000
size=19644894
bit_rate=2196095
probe_score=100
TAG:major_brand=isom
TAG:minor_version=512
TAG:compatible_brands=isomiso2avc1mp41
TAG:creation_time=2022-09-28T07:41:56.000000Z
[/FORMAT]

现在我们已经了解了使用ffprobe可以获得的信息的深度,让我们看看如何对输出进行精细打印,以便于将其传递到下游(用于后处理,或用于压缩等)。

输出格式 - json、xml、csv

ffprobe提供了大量的写入器选项,您可以从默认格式(正如我们在前面的示例中所看到的)、JSON、CSV、XML、flat和ini输出格式中进行选择。

选择输出格式非常简单,需要在命令行中使用print_format <选项>。以下是show_format说明符的输出如何查找的几个示例。

json

$ ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format json -select_streams v:0 -show_format 1.mp4
{
    "format": {
        "filename": "1.mp4",
        "nb_streams": 3,
        "nb_programs": 0,
        "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
        "format_long_name": "QuickTime / MOV",
        "start_time": "0.000000",
        "duration": "71.563000",
        "size": "19644894",
        "bit_rate": "2196095",
        "probe_score": 100,
        "tags": {
            "major_brand": "isom",
            "minor_version": "512",
            "compatible_brands": "isomiso2avc1mp41",
            "creation_time": "2022-09-28T07:41:56.000000Z"
        }
    }
}

CSV(compact)

$ ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format csv -select_streams v:0 -show_format 1.mp4
format,1.mp4,3,0,"mov,mp4,m4a,3gp,3g2,mj2",QuickTime / MOV,0.000000,71.563000,19644894,2196095,100,isom,512,isomiso2avc1mp41,2022-09-28T07:41:56.000000Z

XML

$ ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format xml -select_streams v:0 -show_format 1.mp4
<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
    <format filename="1.mp4" nb_streams="3" nb_programs="0" format_name="mov,mp4,m4a,3gp,3g2,mj2" format_long_name="QuickTime / MOV" start_time="0.000000" duration="71.563000" size="19644894" bit_rate="2196095" probe_score="100">
        <tag key="major_brand" value="isom"/>
        <tag key="minor_version" value="512"/>
        <tag key="compatible_brands" value="isomiso2avc1mp41"/>
        <tag key="creation_time" value="2022-09-28T07:41:56.000000Z"/>
    </format>
</ffprobe>

init

$ ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format ini -select_streams v:0 -show_format 1.mp4
# ffprobe output

[format]
filename=1.mp4
nb_streams=3
nb_programs=0
format_name=mov,mp4,m4a,3gp,3g2,mj2
format_long_name=QuickTime / MOV
start_time=0.000000
duration=71.563000
size=19644894
bit_rate=2196095
probe_score=100

[format.tags]
major_brand=isom
minor_version=512
compatible_brands=isomiso2avc1mp41
creation_time=2022-09-28T07\:41\:56.000000Z

flat

$ ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format flat -select_streams v:0 -show_format 1.mp4
format.filename="1.mp4"
format.nb_streams=3
format.nb_programs=0
format.format_name="mov,mp4,m4a,3gp,3g2,mj2"
format.format_long_name="QuickTime / MOV"
format.start_time="0.000000"
format.duration="71.563000"
format.size="19644894"
format.bit_rate="2196095"
format.probe_score=100
format.tags.major_brand="isom"
format.tags.minor_version="512"
format.tags.compatible_brands="isomiso2avc1mp41"
format.tags.creation_time="2022-09-28T07:41:56.000000Z"

提取指定信息

在前面的章节中,我们已经了解了format、stream、packet和frame;我们还学习了如何以XML、CSV、JSON、flat和ini格式打印ffprobe的输出。

现在,如果我们只想提取编解码器细节,或帧大小,或使用ffprobe的picture_type,我们怎么做呢?

Ffprobe有流说明符,允许您指定和提取您所需要的信息,而不是打印所有内容!要使用这些说明符,首先需要使用format、stream、packet、frame选项,然后使用-show_entries选项以及您希望提取的键。

有了一个例子就更容易理解了。让我们打印视频的高度和宽度!

高度和宽度显示在流级信息中。因此,我们需要首先在命令行中指定选项-show_entries。然后,我们使用stream=width, height来告诉ffprobe只从“stream”信息中给我们宽度和高度的细节。

类似地,我们可以使用" packet ", " format ", " frame ", " stream ",然后指定键(逗号分隔)来只打印这些信息。

在接下来的几节中,让我们来看看这方面的一些实际示例!

提取流信息

到目前为止,我们已经学了这么多,现在让我们看一些使用ffprobe的信息提取示例。

宽高信息

为了使用ffprobe提取视频的高度和宽度,你需要高度和宽度说明符,ffprobe将返回数据。这是命令行:

$ ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format flat -select_streams v:0 -show_entries stream=width,height 1.mp4
streams.stream.0.width=1920
streams.stream.0.height=1080

显示所有报文的PTS信息

要提取视频中所有数据包的PTS(图片时间戳),需要使用如下修饰符 :

$ ffprobe -v error -hide_banner -of default=noprint_wrappers=1 -select_streams v:0 -show_entries packet=pts_time 1.mp4
pts_time=0.000000
pts_time=0.001000
pts_time=0.002000
pts_time=0.003000
pts_time=0.004000
pts_time=0.005000
pts_time=0.006000
pts_time=0.007000
pts_time=0.008000
pts_time=0.009000
pts_time=0.010000
pts_time=0.011000
...

使用ffprobe查找持续时间并以json格式打印

$ ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format json -select_streams v:0 -show_entries stream=duration 1.mp4
{
    "programs": [

    ],
    "streams": [
        {
            "duration": "70.330000"
        }
    ]
}

帧类型

如果你想用ffprobe知道视频每一帧的类型,那么你需要下到帧级别。如果检查我们前面打印的帧级信息,那么可以看到图片类型信息包含在pict_type键中。让我们把它和帧修改器一起使用。

$ ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format flat  -select_streams v:0 -show_entries frame=pict_type 1.mp4
frames.frame.0.pict_type="I"
frames.frame.1.pict_type="P"
frames.frame.2.pict_type="P"
frames.frame.3.pict_type="P"
frames.frame.4.pict_type="P"
frames.frame.5.pict_type="P"
frames.frame.6.pict_type="P"
frames.frame.7.pict_type="P"
frames.frame.8.pict_type="P"

获取视频的比特率信息

视频的比特率在流级打印。因此,我们需要在命令行中指定stream=bit_rate来获取视频的比特率。

$ ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format flat  -select_streams v:0 -show_entries stream=bit_rate 1.mp4
streams.stream.0.bit_rate="2119734"

获取视频的编码器信息

你从哪里得到编解码器的细节?在流层面,对吧?让我们使用流说明符,获取所有这些信息。

$ ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format flat  -select_streams v:0 -show_entries stream=codec_name,codec_long_name,profile,codec_tag_string 1.mp4
streams.stream.0.codec_name="h264"
streams.stream.0.codec_long_name="H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"
streams.stream.0.profile="Constrained Baseline"
streams.stream.0.codec_tag_string="avc1"

获取像素信息

$ ffprobe -v error -hide_banner -of default=noprint_wrappers=0 -print_format flat  -select_streams v:0 -show_entries stream=pix_fmt 1.mp4
streams.stream.0.pix_fmt="yuv420p"

推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习

05-24 04:21