一、前言
ffprobe 是一个多媒体流分析工具。它从多媒体流中收集信息,并且以人类和机器可读的形式打印出来。
它可以用来检测多媒体流的容器类型,以及每一个多媒体流的格式和类型。它可以作为一个独立的应用来使用,也可以结合文本过滤器执行更复杂的处理。
1、部署安装
ffmpeg官网下载:FFmpeg Static Builds
- 软件包下载
下载官网已编译构建好的ffmpeg包
[root@node190 home]# wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-i686-static.tar.xz
[root@node190 home]# xz -d ffmpeg-release-i686-static.tar.xz
[root@node190 home]# tar -xvf ffmpeg-release-i686-static.tar
- 软件包部署
将编译好的ffmpeg和ffprobe链接至/usr/bin目录下,之后就可以直接使用ffmpeg和ffprobe命令
[root@node190 home]# ln -s /home/ffmpeg-4.4-i686-static/ffmpeg /usr/bin/ffmpeg
[root@node190 home]# ln -s /home/ffmpeg-4.4-i686-static/ffprobe /usr/bin/ffprobe
二、常用操作
1、视频处理
- 视频转码
ffmpeg -i {input-file} -c copy {output-file}
参考示例:ffmpeg -i 20201013000000.ps -c copy 20201013000000.mp4
- 视频拼接
将需要拼接的文件列表写到file-list.txt
文件,格式为file '/{path}/{file}'
[root@node42 home]# cat file-list.txt
file '/home/input/1.ps'
file '/home/input/2.ps'
执行命令如下:
ffmpeg -safe 0 -f concat -i {file-list} -c copy {output-file}
参考示例:[root@node42 home]# ffmpeg -safe 0 -f concat -i file-list.txt -c copy mix.mp4
- 视频元数据处理
部分视频元数据放在文件尾部,导致无法边下边播,需要将元数据移动到文件头部
ffmpeg -i {input-file} -movflags faststart -c copy {output-file}
- 查看视频文件属性信息
ffprobe -v quiet -print_format json -show_format -show_streams -i {filename}
- 查看视频文件丢帧情况
可通过以下两种方式去验证:
查看写入视频时间长度是否一致:ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 {filename}
查看写入视频帧数是否一致:ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 {filename}
参考示例如下,视频25帧1秒,时间长度为600s(即15000帧),存在文件写入丢帧情况(时间长度丢失2秒,帧数丢失50帧)
[root@node111 ~]# ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 /vcluster/cephfs/nfsdata/116/client-5-2021-03-04T14-50-02.mp4
14950
[root@node111 ~]# ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 /vcluster/cephfs/nfsdata/118/client-5-2021-03-04T14-50-02.mp4
15000
[root@node111 ~]# ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 /vcluster/cephfs/nfsdata/116/client-5-2021-03-04T14-50-02.mp4
598.000000
[root@node111 ~]# ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 /vcluster/cephfs/nfsdata/118/client-5-2021-03-04T14-50-02.mp4
600.000000
三、扩展
1、MP4封装格式解析
如上图所示,MP4所有文件数据都装在box中 (iso-14496-12/14) (QuickTime中为atom),可以通俗理解为,一个MP4文件由很多树状结构box组成,每个box包含不同的信息。相关参考说明如下:
ROOT
|- ftyp file type,文件类型
|- moov metadata container,存放媒体元数据信息,如媒体时间信息、trak信息和媒体索引等
|- mvhd movie header,文件的总体信息,如可播放时长、创建时间、修改时间、时间度量标尺等
|- trak track container,存放音频、视频流信息的容器
|- tkhd track header,track的总体信息,如时长、宽高等
|- edts
|- mdia
|- trak
|- udta
|- free 可选值,数据通常全为0,其作用相当于占位符,视频录制时不能预知视频大小,如果moov在mdat之前,moov数据会随着拍摄mdat数据增加而增加,以free占位预留空间,避免出现后移mdat数据腾出moov空间情况
|- mdat media data container,具体媒体数据,最终解码播放的数据都存在这个box内
http协议流模式实现原理为:
先获取视频的格式信息、关键帧等信息,然后在用户拖动的时候,根据关键帧等信息,找到对应的关键帧的位置的二进制数据,填充播放。
综合所述,moov位置信息对于视频播放影响很大
- 当moov在mdat之前,则代表视频元数据在文件头部,支持边下边播功能
- 当moov在mdat之后,则代表视频元数据在文件尾部,需要完整下载文件之后才能播放