网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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": [



**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**
-show_entries stream=duration 1.mp4
{
"programs": [
[外链图片转存中...(img-alUvnKnX-1715882441383)]
[外链图片转存中...(img-OTAVOIyL-1715882441383)]
[外链图片转存中...(img-tDSEA5aM-1715882441384)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**