Go最全ffprobe学习(1),记一次字节跳动Golang社招面试

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Duration: 00:01:11.56, start: 0.000000, bitrate: 2196 kb/s
Stream #0:00x1: 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: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]


从输出中可以看到,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:00x1: 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: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"?>

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

mat 1.mp4

<?xml version="1.0" encoding="UTF-8"?>

[外链图片转存中…(img-DXMTUARF-1715502924623)]
[外链图片转存中…(img-VGg7mjOv-1715502924624)]
[外链图片转存中…(img-nehP1Tsn-1715502924624)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值