ffprobe 原创教程 2019.5版

NAZOrip@A
NAZOrip@A 5月3日
  • 在其它设备中阅读本文章

感谢阅读哦(๑˃̵ᴗ˂̵)و 本文目的是给出主要参数的所有用途,以及解释输出的一些值(含少量科普). 由于教程当前版本早(RC),有翻译和知识储备上的问题,先道个歉~


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

::一般用途:

ffprobe [参数] [输入]
ffprobe -i [输入] [参数]

::写入:

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<开关>开始结束格式改0:00:00.000000,总大小改Kib/MiB,总码率改Kbps/Mbps,相当于设置了-unix,-prefix,-byte_binary_prefix和-sexagesimal四个参数,只要不给机器读,建议一直使用此参数

::选择特定流:
-select_streams<a:#/v:#>如v:0代表选用第0号视频流. 一个封装中嵌入多个视/音频用,"#代表任意数字"

::格式美化:
-of(-print_format)<字符/字符+命令>default<nk/nw>,json<c>,xml<q/x>,flat<s>,csv<s/nk/e=c/e=csv/p>,ini<h>(of是omit format的简拼,不知道为什么不是pf)

???=???=1---------------1确定,0取消(毫无意义但是必须写上这个=1,很奇怪)

default=nk=1------------只输出值和换行
default=nw=1------------去掉[]和[/]两行字
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语言换码符
csv=nk=1----------------只输出值

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

提供信息参数:

::翻译格式:

[KEY]
SectionName-------------翻译------------------进一步解释或例子
[/KEY]

-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<开关>具体功能未知

-select_streams<a/v/a:#/v:#>用这个参数只列出封装中的一个流,a:0能选择封装中的第0号音频流,只有一个视频和音频的情况不用写":"

-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_spac--------------------------色彩空间---------------------源用的色彩空间
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_rat-----------------------------码率
max_bit_rate------------------------最大码率
bits_per_raw_sample-----------------采样内容深度(色深)
nb_frames---------------------------总帧数
nb_read_frames----------------------读取帧总数
nb_read_packets---------------------读取数据包总数
[/STREAM]

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

时尺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---------------------编解码时基/时间戳----------一般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_format/streams/packets参数里的某些信息:
-show_entries <format=><stream=><packet=>(这里反而不写streamS和packetS了,很奇怪)

::使用例子 -show_entries packet=duration,dts,codec_type 输出结果:
[PACKET](换行)duration=,dts=(换行)[/PACKET]

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

那么就这样<(。_。)>

::附: Typecho无法使用大空格(TAB键)对齐,先用小空格将靠左单词长度同化也没用,只有------
::转载要求: 在本文下方写上"转载冒号转载地址",若不愿意注册则发邮件到jgong117398@gmail.com或732178924@qq.com