参考:
http://blog.chinaunix.net/uid-11344913-id-5750194.html
https://www.jianshu.com/p/e14bc2551cfd
在FFMpeg套件中,出了ffmpeg还有ffprobe,ffprobe主要用来查看多媒体文件的信息,下面看一下ffprobe中常见的基本命令.
5.1 ffprobe 常用参数
ffprobe常用参数比较多,可以用过ffprobe --help来查看详细的信息:
5.2 下面重点聚几个例子:
5.2.1 使用show_packets查看多媒体报信息:
show_packets查看的多媒体包信息使用PACKET标签所包括起来,其中包含的信息主要如下:
codec_type: 多媒体类型,例如视频包,音频包等;
stream_index: 多媒体的stream索引;
pts: 多媒体的显示时间值
pts_time: 根据不同格式计算过后的多媒体的显示时间
dts: 多媒体解码时间值
dts_time: 根据不同格式计算过后的多媒体解码时间
duration: 多媒体包占用的时间值
duration_time: 根据不同格式计算过后的多媒体包占用的时间值
size: 多媒体包的大小
pos: 多媒体包所在的文件偏移位置
flags: 多媒体包标记,关键包与非关键包的标记
packets包中除了以上的字段和信息外,还可以通过show_data与show_packets组合来显示包中的具体的数据:
图中看到了多媒体包中包含的数据,初始信息为0000 01b6 51e0 47ff,那么我们可以根据图中的pos,也就是文件偏移位置查看,根据图中,pos的值为3273,通过转换为16进制,位置为0x00000cc9,与data的数据是可以对应的:
通过ffprobe读取packets来进行对应的数据分析,使用show_packets与show_data配合可以更加精确的分析。
5.2.2 除了packets与data外,ffprobe还可以分析多媒体的封装格式,通过show_format参数可以查看多媒体的封装格式,封装可是使用FORMAT标签括起来显示:
通过读取format信息,可以看到这个视频文件只有一个流通道,起始时间是0.000000,长度为85.867000,文件大小为2377700字节,码率为221523字节每秒,这个文件有可能是一个mov、有可能是mp4、有可能是m4a、有可能是3gp、有可能是3g2、也有可能是mj2,之所以ffprobe会这么输出,是因为这几种封装格式在ffmpeg中所识别的标签基本相同,所以才会这么多种显示方式,而其他种封装格式不一定是这样的,下面我们再看一个wmv的封装格式
这个input.wmv文件中包含两个流通道,文件封装格式为asf。
5.2.3 通过ffprobe的show_frame的参数可以查看视频文件中的帧信息,输出的帧信息使用FRAME标签括起来
通过-show_frame参数查看到如图的信息,能够看到每一帧的信息,下面介绍一下重要的信息
属性 | 说明 | 值 |
media_type | 帧的类型(视频、音频、字幕等) | video |
stream_index | 帧所在的索引区域 | 0 |
Key_frame | 是否是关键帧 | 1 |
Pkt_pts | Frame包的pts | 0 |
Pkt_pts_time | Frame包的pts的时间显示 | 0.000000 |
Pkt_dts | Frame包的dts | 0 |
Pkt_dts_time | Frame包的dts的时间显示 | 0.000000 |
Pkt_duration | Frame包的时长 | 1024 |
Pkt_duration_tine | Frame包的时长时间显示 | 0.066667 |
Pkt_pos | Frame包所在文件的偏移位置 | 44 |
Width | 帧显示的宽度 | 608 |
height | 帧显示的高度 | 320 |
Pix_fmt | 帧的图像色彩格式 | Yuv420p |
Pict_type | 帧类型 | I |
在windows下常用的Elecard Stream Eye打开查看mp4时,会看到很直观的帧类型显示,每一帧的判断,用ffprobe的pict_type同样可以看到,每一帧的大小,也同样可以通过ffprobe的pkt_size看到,pict_type可以或得到视频的帧是I帧、P帧或者B帧。
通过-show_streams参数可以查看到多媒体文件中的流信息,流的信息使用STREAMS标签括起来:
如图所示,可以看到流的信息:
属性 | 说明 | 值 |
Index | 流所在的索引区域 | 0 |
Codec_name | 编码名 | Mpeg4 |
Codec_long_name | 编码全名 | MPEG-4 part 2 |
profile | 编码的profile | Simple Profile |
level | 编码的level | 1 |
Has_b_frames | 包含B帧信息 | 0 |
Codec_tyoe | 编码类型 | Video |
Codec_time_base | 编码的时间戳计算基础单位 | 1/15 |
Pix_fmt | 图像显示图像色彩格式 | Yuv420p |
Coded_width | 图像的宽度 | 608 |
Coded_height | 图像的高度 | 320 |
Codec_tag_string | 编码的标签数据 | Mp4v |
除了以上这些信息,还有更多信息
下面再介绍一下图中这些信息
属性 | 说明 | 值 |
R_frame_rate | 实际帧率 | 15/1 |
Avg_frame_rate | 平均帧率 | 15/1 |
Time_base | 时间基数(用来做timestamp计算) | 1/15360 |
Bit_rate | 码率 | 220914 |
Max_bit_rate | 最大码率 | 220914 |
Nb_frames | 帧数 | 1288 |
5.3 ffprobe使用前面的参数可以获得到对应的key-value,但是阅读起来因习惯不同所以有的人认为方便,有的人认为不方便,这样就需要用到ffprobe的print_format参数来进行相应的格式输出,下面举几种输出的例子:
5.3.1 XML格式输出:
5.3.2 ini格式输出
5.3.3 flat格式输出
5.3.4 json格式输出
5.3.5 csv格式输出
通过各种格式输出,可以使用对应的绘图方式绘制出可视化的图形:
csv格式输出后使用excel打开表格形式
将表格中的数据以图形方式绘制出来
图形绘制出来的时候,可以看到对应的图形与Elecard Stream Eye基本相同。
5.4 如果只查看音频流或视频流,使用select_streams参数即可,例如只查看视频流的frames信息:
ffprobe -show_frames -select_streams v -of xml input.mp4
命令行执行后可以看到输出的信息如下,全部为视频的frames信息: