ffprobe 原创教程 2022版 更新3

A@NAZOrip
A@NAZOrip 2019年05月20日
  • 在其它设备中阅读本文章

视频探针ffprobe是ffmpeg的一个分支,用于直接分析流媒体,给出正确精确的信息. 参数主要有信息提供和格式美化两种. 相比GUI软件,可以方便的输出需要的值,喂给下游程序;或者替代GUI应用,快速得到需要的信息. probe可以译作任何探测器具的名称,此处只因作者喜欢所以译为视频探针(⊙o⊙)


::一般用途:

ffprobe [参数] [输入]
ffprobe -i [输入] [参数]
ffprobe.exe -i ".\视频.mp4" -select_streams v:0 -v error -hide_banner -show_streams -show_frames -read_intervals "%+#1" -show_entries frame=top_field_first:stream=codec_long_name,width,coded_width,height,coded_height,pix_fmt,color_range,field_order,r_frame_rate,avg_frame_rate,nb_frames,color_space,color_transfer,color_primaries -of ini > "X:\文件夹\视频信息.txt"

::写入:

ffprobe [参数] [输入] >1.txt

::叠加:

>>1.txt

::临时变量(.bat):

@ set 给出分辨率=ffprobe [参数1]
@ set 给出时长=ffprobe [参数2]

%给出时长% [输入1]
%给出分辨率% [输入2]
%给出分辨率% [输入3]
pause

::临时变量(.sh):

#!/bin/Bash
给出分辨率=ffprobe [参数1]
给出时长=ffprobe [参数2]

$给出时长 [输入1]
$给出分辨率 [输入2]
$给出分辨率 [输入3]
read -rsp $'按任意键继续...\n' -n 1 key

常用参数

-hide_banner<开关>不显示版权,编译源,配置,libav等信息(一般v error即可)

-v(-loglevel)<字符>quiet不报错,panic只报能崩溃的错,fatal只报能终止分析的错,error报错,warning警告+报错,info所有有效信息(警告,报错,版权,编译源,配置,libav等)

-pretty<开关>体积数据加单位(-unit),开始结束格式改0:00:00.000000 (-sexagesimal),总大小改Kib/MiB (-prefix),总码率改Kbps/Mbps (-byte_binary_prefix),只要不给机器读,建议一直使用此参数

-show_entries<开关>当不希望show_format,show_frames,show_packet输出一大坨信息的时候(即90%的情况下)用format=<attribute1>,<attribute2>:stream=<attribute1>,<attribute2>:frame=<attribute1>,<attribute2>:packet=<attribute1>,<attribute2>来限制显示内容。限制范围见下面show_format,show_frames,show_packet的释义

-select_streams<a/v/a:#/v:#>用这个参数只输出封装中的一个流,a:0能选择封装中的第0号音频流,只有一个视频和音频的情况不用写":". 缺点是只能手动分离字幕流和视频流

::格式:
-of(-print_format)<字符/字符+命令>default,json,xml,flat,csv,ini(of感觉应该是omit format,pf才是print format啊=_=)

???:???=1---------------用来选择default/json/xml/csv等等输出工具的选项

default:nokey=1------------只输出值和换行
default:noprint_wrappers=1-去掉[]和[/]两行字,html里相当于开始结束标记
default:nk=1:=nw=1---------两个一起

json--------------------写成json格式
json:c=1----------------使用精简compact写法

xml---------------------写成xml格式
xml:q=1-----------------输出fully_qualified,能通过XSD文件认证的xml
xml:x=1-----------------检查输出的xml是否能通过XSD文件认证

flat--------------------适合shell的值(streams.stream.0.codec_name="h264")
flat:s=~----------------自定分隔符(如streams~stream~0~codec_name="h264")
flat:h=1----------------用分叉hierarchical结构写子项目

csv---------------------使用精简compact写法,所有项目变成一行字串,用逗号分隔
csv:s=~-----------------自定分隔符,默认逗号
csv:nk=1----------------只输出值
csv:e=c-----------------用C语言换码符

ini---------------------使用ini格式(这个比默认还好看,建议替代默认哦)
ini:h=1-----------------用分叉hierarchical结构写子项目

信息输出

::<参数>:

[标记]
参数--------------------翻译------------------进一步解释或例子
[/标记]

-show_format<开关>

[FORMAT]
filename----------------文件名和路径
nb_streams--------------流数量----------------视音频流总数
nb_programs-------------?程序数量?
format_name-------------封装格式名
format_long_name--------封装格式全名
start_time--------------开始------------------以秒显示,6位小数
duration----------------时长秒
size--------------------总大小----------------byte,3,000,000B = 3MB = 2.97MiB
bit_rate----------------总码率 ---------------bit,1,000,000b = 1Mb = 0.125MB = 0.119MiB
probe_score-------------探针得分--------------ffmpeg检查文件后缀+元数据的格式描述是否属实的判定,此处没用
[/FORMAT]

-show_programs<开关>具体功能未知

附: 视频技术的时间观念:

时尺Time Scale 60代表60帧每秒

时间戳Time Stamp/Base 分数显示每帧显示多长时间,1/60代表一帧出现六十分之一秒

显示时间戳Presentation TS 与时间戳相乘的倍数,按照规律变大(0,3,6,9...),算出来的数就是此帧在解码时的播放时间
显示戳时间PTS Time 显示时间戳pts×时间戳ts,算出来的数就是以秒为单位的播放时间

解码时间戳Decoding TS 与时间戳相乘的倍数,按照规律变大. 应比显示时间早
解码戳时间DTS Time 解码的执行时间,解码时间戳dts乘以时间戳ts

这么复杂有些原因是为支持可变帧率VFR技术. 没VFR,手机录像当场没电

时长秒Duration 可以用来精确(6位小数)得知流结尾时间
时长戳Duration_ts Dts不是DTS,却是造成混淆的原因之一,此处代表TS格式的时长

时长可以看做结束时间


-show_streams(视频流)

[STREAM]
index-------------------------------目录------------------------此封装中的第#个视/音频流
codec_name--------------------------编解码名
codec_long_name---------------------编解码全名
profile
codec_type--------------------------编解码类
codec_time_base---------------------编解码时基/时戳--------------解释见"视频技术的时间观念"
codec_tag_string--------------------编解码标签字符---------------如avc1(就是0x31 0x63 0x76 0x61翻译成字符)
codec_tag---------------------------编解码标签-------------------FourCC格式的字符串,0x31637661
width
height
has_b_frames------------------------B帧存在
coded_width-------------------------编码宽----------------------对比宽和高,可判断非方形像素视频
coded_height------------------------编码高
sample_aspect_ratio-----------------源宽高比
display_aspect_ratio----------------显示宽高比-------------------对比源宽高比,可算出拉伸比率
pxl_fmt-----------------------------像素格式
level
color_range-------------------------色彩范围---------------------pc/tv
color_space-------------------------色彩空间---------------------源用的色彩空间
color_transfer----------------------色彩空间转换-----------------播放用色彩空间
color_primaries---------------------三原色值标准-----------------播放用基色,指定给和播放器默认所不同的源
chroma_location---------------------色度采样位置
field_order-------------------------优先场
time_code---------------------------时间码
refs--------------------------------参考帧(不好使?)--------------视频的参考帧数量设定,数字通常算不对?
is_avc------------------------------AVC格式确认(未测试is_hevc, is_isom等)
nal_length_size---------------------NAL长度大小
ID
r_frame_rate------------------------率帧率
avg_frame_rate----------------------平均帧率
time_base---------------------------时基戳-----------------------用分数表示一帧出现多长时间(pts_time÷pts)
start_pts---------------------------起始显示时间戳
start_time--------------------------起始时间
duration_ts-------------------------时长戳
duration----------------------------时长秒
bit_rate----------------------------码率
max_bit_rate------------------------最大码率
bits_per_raw_sample-----------------采样内容深度(色深)
nb_frames---------------------------总帧数
nb_read_frames----------------------读取帧总数
nb_read_packets---------------------读取数据包总数
[/STREAM]

-show_streams(音频流)

[STREAM]
index-------------------------------目录----------------------此封装中的第#个视/音频流
codec_name--------------------------编解码名
codec_long_name---------------------编解码全名
profile
codec_type--------------------------编解码类
codec_time_base---------------------编解码时基/时间戳----------一般1/44100
codec_tag_string--------------------编解码标签字符-------------FourCC格式的字符串,特殊情况是PCM_S16LE标着0x0001
codec_tag---------------------------编解码标签
sample_fmt--------------------------采样格式
sample_rate-------------------------采样率
channels----------------------------声道数
channel_layout----------------------声道布置-------------------一般strero立体声
bits_per_sample---------------------位深
ID
r_frame_rate------------------------率帧率---------------------N/A
avg_frame_rate----------------------平均帧率-------------------N/A
time_base---------------------------时基戳---------------------一般1/44100
start_pts---------------------------起始显示时间戳-------------N/A
start_time--------------------------起始时间------------------N/A
duration_ts-------------------------时长戳
duration----------------------------时长秒
bit_rate----------------------------码率
max_bit_rate------------------------最大码率
bits_per_raw_sample-----------------采样内容深度--------------N/A
nb_frames---------------------------总帧数-------------------N/A
nb_read_frames----------------------读取帧总数---------------N/A
nb_read_packets---------------------读取数据包总数-----------N/A
[/STREAM]

-show_packets(视音频混合? 由于是网络数据包,所以一般会输出上千个packets)

[PACKET]
codec_type--------------------------编解码种类---------------视频/音频
stream_index------------------------目录--------------------此封装中的第#个视/音频流
pts---------------------------------显示时间戳
pts_time----------------------------显示戳时间
dts---------------------------------解码时间戳
dts_time----------------------------解码戳时间
duration----------------------------时长秒
duration_time-----------------------时长戳
convergence_duration----------------收敛时长戳--------------当前所有路由器对网络结构变动(增加减少路由器)而适应所需时间
convergence_duration_time-----------收敛时长秒
size--------------------------------大小
[/PACKET]

-show_frames(注意,音频里也有帧,如不希望音频信息则用select_streams过滤掉)。缺点:只能手动分离字幕流和视频流

[FRAME.<当前所处帧号>]
media_type--------------------------音/视/字幕流
stream_index------------------------目录--------------------此封装中的第#个视/音频流
key_frame---------------------------是否为关键帧-------------0=i/P/B帧,1=IDR帧
pkt_pts-----------------------------封装数据包的显示时间戳
pkt_pts_time------------------------封装数据包的显示戳时间
pkt_dts-----------------------------封装数据包的解码时间戳
pkt_dts_time------------------------封装数据包的解码戳时间
best_effort_timestamp---------------pts缺失下用帧号,avctx,pkt_dts推算的时间戳
pkt_duration------------------------封装数据包的时长秒
pkt_duration_time-------------------封装数据包的时长戳
pkt_pos-----------------------------封装数据包的所需号位
pkt_size----------------------------封装数据包的所需大小
width-------------------------------宽
height------------------------------高
pix_fmt-----------------------------像素排列格式
pict_type---------------------------帧类型(I/B/P)
coded_picture_number----------------编码帧号位
display_picture_number--------------显示帧号位
interlaced_frame--------------------是否交错(0/1)
top_field_first---------------------是否上场优先(0/1)
repeat_pict-------------------------重复帧(SEI标注padding)
color_range-------------------------full=pc,limited=tv
chroma_location---------------------色度采样朝向位置
[/FRAME]

::输出多个信息:
-show_streams -show_format等参数并列写上即可

::导出1.mp4的信息到1.txt,隐藏标题,美化,用ini逐单元缩进格式书写:

ffprobe.exe -i "1.mp4" -hide_banner -pretty -of ini:h=1 >> 1.txt

那么就这样。如果觉得没啥用的话,那...来学学搭配Excel实现码率曲线,码率趋势,帧类型饼图的方法呗 <(。_。)>

::附: Typecho无法使用大空格(TAB键)对齐,先用小空格将靠左单词长度同化也没用,只有-
::转载要求: 在本文下方写上"转载+冒号+转载地址",或者下方发个评论... 但是真的会有人转载这玩意儿吗?

打赏信息

在线丢人,求个打赏,支持一下T_T
pp_tip_qrcode.png

    Shangxin
    Shangxin  2020-12-11, 12:06

    牛逼,有些很细的东西我在ffmpeg官方都没找到(可能是我太菜了),在这里解决了

      NAZOrip@A
      NAZOrip@A  2021-01-20, 04:45

      ffmpeg官方文档的排版很迷的,看不懂很正常=_=