【工具相关】ffmpeg音视频处理

本文介绍了FFmpeg工具中的ffprobe用于多媒体流分析,包括视频转码、拼接、元数据处理等操作。通过示例演示了如何使用ffprobe检查视频文件属性、丢帧情况,以及MP4文件的封装格式解析,强调了moov位置对视频播放的重要性。
摘要由CSDN通过智能技术生成

一、前言

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之后,则代表视频元数据在文件尾部,需要完整下载文件之后才能播放
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值