Go最新ffprobe学习(3),Golang开发者

img
img

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

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

一个人可以走的很快,但一群人才能走的更远!不论你是正从事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": [



![img](https://img-blog.csdnimg.cn/img_convert/488db250c0853750f2bbdbeed2b8e777.png)
![img](https://img-blog.csdnimg.cn/img_convert/d35f87252acd67ba9bc83e14c360556f.png)
![img](https://img-blog.csdnimg.cn/img_convert/f631279f9f857c8ae377a531aba037f1.png)

**既有适合小白学习的零基础资料,也有适合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)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值