ffprobe学习(1)

  handler_name    : VideoHandler
  vendor_id       : [0][0][0][0]

Stream #0:10x2: 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:20x3: 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"?>

### 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”


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值