1. 程式人生 > 其它 >【工具相關】ffmpeg音視訊處理

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