FFmpeg 套件中,除了 ffmpeg 作为多媒体处理工具之外,还有 ffprobe 多媒体信息查看工具, ffprobe 主要用来查看多媒体文件的信息,下面就来看 ffprobe 中常见的基本命令。
ffprobe 常用的参数比较多,可以通过 ffprobe --help
来查看详细的帮助信息:
看到40页。。。
这些输出的帮助信息既是 ffprobe 常用的操作参数,也是 ffprobe 的基础参数。例如查看 log,查看每一个音频数据包信息或者视频数据包信息,查看节目信息,查看流信息,查看每一个流有多少帧以及每一个流有多少个音视频包,查看视频像素点的格式等。下面就来根据以上的输出参重点列举几个例子。
ffprobe -show_packets input.mp4
使用 ffprobe -show_packets input.mp4
查看多媒体数据包信息:
通过 show_packets 查看的多媒体数据包信息使用 PACKET 标签括起来,其中包含的信息主要如 2-3 所示。
ffprobe -show_data -show_packets input.mp4
除了以上字段和信息之外,还可以通过 ffprobe -show_data -show_packets input.mp4
组合参数来查看包中的具体数据:
看到42页
ffprobe -show_data -show_packets groundhog_h264.mp4 | less
从输出的内容中可以看到多媒体包中包含的数据,初始信息为 0000 02ae 0605 ffff ,那么我们可以根据上述输出内容中的 pos ,也就是文件偏移位置来查看, pos 的值为48 ,将其转换为十六进制,位置为 0x00000030 ,刚好等于 FLVTAG 的数据在 flv 文件的偏移位置,可以使用 Linux 下的 xxd nput.flv 命令进行查看:
xxd groundhog_h264.mp4 | less
ffprobe -show_format output.mp4
通过 ffprobe 读取 packets 来进行对应的数据分析,使用 show_packets 与 show_data 配合可以进行更加精确的分析。
除了 packets 与 data 之外,ffprobe 还可以分析多媒体的封装格式,通过 ffprobe -show_format output.mp4 命令可以查看多媒体的封装格式,其使用 FORMAT 标签括起来显示:
下面对输出信息关键字段进行说明,具体见表 2-4:
参考表 2-4 介绍的字段来解析输出,可以看到这个视频文件只有1个流通道,起始时间是 0.000 000 ,总时间长度为 10.080 000 ,文件大小为 212 111 字节,码率为 168 342bit/s,这个文件的格式有可能是 MOV、MP4、M4A、3GP、3G2 或者 MJ2 ,之所以 ffprobe 这么输出, 是因为这几种封装格式在 ffmpeg 中所识别的标签基本相同,所以才会有这么多种显示方式,而其他几种封装格式不一定是这样的,下面我们再来看 WMV 的封装格式:
这个 input.wmv 文件中包含一个流通道,文件封装格式为 ASF。
ffprobe -show_frames input.flv
通过 ffprobe -show_frames input.flv 令可以查看视频文件中的帧信息,输出的帧信息将使用 FRAME 标签括起来:
看到44页
通过 -show_frames
参数可以查看每一帧的信息,下面就来介绍一下其中重要的信息,具体见表 2-5。
Windows 下常用的 Elecard StreamEye 工具中打开查看 MP4 时,会很直观地看到帧类型显示,用 ffprobe 的 pict_type 同样可以看到视频的帧是 I 帧、P帧或者B帧;每一帧的大小同样也可以通过 ffprobe 的 pkt_size 查看到。
ffprobe -show_streams input.flv
通过 -show_streams
参数可以查看到多媒体文件中的流信息,流的信息将使用STREAM 标签括起来:
如以上输出内容所示,从中可以看到流的信息,具体属性及说明见表 2-6。
除了以上这些信息,还有更多信息,具体如下:
下面再来介绍一下多输出的这些信息,具体说明见表 2-7。
ffprobe 使用前面的参数可以获得 key-value 格式的显示方式,但是阅读起来因习惯不同,可能有的人会认为方便,有的人认为不方便;如果要进行格式化的显示,这样就需要用到 ffprobe -print_format
或者 ffprobe -of
参数来进行相应的格式输出,而-print_format
支持多种格式输出,包括 XML、INI、JSON、CSV、FLAT等。下面列举几种常见的格式输出的例子。
通过 ffprobe -of xml -show_streams input.flv
得到的 XML 输出格式如下所示:
从输出的内容可以看出,输出的内容格式为 XML 格式,如果原有的业务本身就可以解析 XML 格式,那么就不需要更改解析引擎,直接将输出内容输出为 XML 格式即可,解析引擎解 Packet 信息时会很方便。
看到47页
通过 ffprobe -of ini -show_streams input.flv 得到的 INI 格式的输出如下所示:
从输出内容可以看到输出的内容格式为 IN 格式,这种格式可以用于擅长解析 INI 格式的项目中。
通过 ffprobe -of flat -show_streams input.flv 输出 FLAT 格式:
从输出的内容可以看到,输出的信息为 FLAT 格式的输出,从 Packet 的 stream_ind ex 的值可以直接得知 Packet 属于哪个 Stream ,从而获得 Stream 对应的 Packet 的信息。
通过 ffprobe -of json -show_packets input.flv 输出 JSON 格式:
从输出内容可以看到,内容信息还是 Packet 信息,但是输出的形式为 JSON 的格式,这种格式的数据可以用在以 JSON 解析为主的业务中。
通过 ffprobe -of csv -show_packets input.flv 输出 csv 格式:
通过各种格式的输出,可以使用对应的绘图方式绘制出可视化图形。csv 格式输出后可使用 Excel 打开表格形式,如图 2-1 所示。
(导出csv数据)
ffprobe -of csv -show_packets input.flv > output.csv
将表格中的数据以图形的方式绘制出来, 如图 2-2 所示。
(用excel打开csv文件,选中想要展示的列,点击插入–> 推荐的图表)
可以看到,图 2-3 所示的图形与 Elecard StreamEye 的可视化图基本相同。
使用 select_streams 可以只查看音频(a)、视频(v)、字幕(s)的信息,例如配合show_frames 查看视频的 frames 信息:
ffprobe -show_frames -select_streams v -of xml input.mp4
命令行执行后可以看到输出的信息如下:
从以上的输出内容中可以看到,输出的 frame 信息全部为视频相关的信息。
使用 ffprobe 还可以查看很多信息,读者可以通过本节介绍的 help 方法查看更多更详细的信息。