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

一、前言#

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之后,则代表视频元数据在文件尾部,需要完整下载文件之后才能播放
posted @   Luxf0  阅读(222)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示
主题色彩