ffprobe 原创教程 2024版 更新4
视频探针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,field_order,r_frame_rate,avg_frame_rate,nb_frames,pix_fmt,color_range,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
问题
ffprobe 可能会输出 pix_fmt 为 "yuvj...
" 而不是 "yuv...
"(如 yuvj420p,yuv420p),这个 j 是被 ffmpeg 淘汰的完整色深 fullrange 写法,代表 jpeg。
在 ffmpeg 的 color_range 参数说明中,可以看到 jpeg 和完整色域是同义词
常用参数
-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
[...]CLI 视音频格式读取器,若检测所得信息与 MediaInfo 所异,则优先参考 ffprobe见基本使用,以及搭配 Excel 的视频数据可视化教程[...]
[...]附录 γ:ffprobe 教程 或 Github 副本[...]
[...]ffmpeg强大的 CLI 开源视音频处理工具。几乎所有的视音频处理都绕不开mpv开源,支持便携的现代视频播放器。见安装与配置教程Voukoder开源 Premiere Vegas After Effects 压制导出插件,分为 Voukoder 和 V-Connector 两部分OBS强大的开源直播框架和软件,设置略比传统录屏软件复杂,但效果也更好MediaInfo开源的 GUI 媒体元数据/视[...]
牛逼,有些很细的东西我在ffmpeg官方都没找到(可能是我太菜了),在这里解决了
ffmpeg官方文档的排版很迷的,看不懂很正常=_=