【工具相關】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之後,則代表視訊元資料在檔案尾部,需要完整下載檔案之後才能播放