其他分享
首页 > 其他分享> > 【工具相关】ffmpeg音视频处理

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

作者:互联网

一、前言

ffprobe 是一个多媒体流分析工具。它从多媒体流中收集信息,并且以人类和机器可读的形式打印出来。
它可以用来检测多媒体流的容器类型,以及每一个多媒体流的格式和类型。它可以作为一个独立的应用来使用,也可以结合文本过滤器执行更复杂的处理。

1、部署安装

ffmpeg官网下载:FFmpeg Static Builds

[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
[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位置信息对于视频播放影响很大

标签:视频,ffmpeg,ffprobe,音视频,file,home,工具,root
来源: https://www.cnblogs.com/luxf0/p/16321664.html