程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> FFmpeg使用手冊 - FFmpeg 的基本組成

FFmpeg使用手冊 - FFmpeg 的基本組成

編輯:JAVA綜合教程

FFmpeg使用手冊 - FFmpeg 的基本組成



1 FFmpeg 的基本組成
FFmpeg 的基本組成包含Format、Codec、Filter、Devices、Utils等,結構如圖:

AvFormats: 主要為媒體文件的封裝格式,也可以稱之為多媒體編碼數據的容器,包含了音頻數據,視頻數據,字幕數據之類的容器;
AvCodecs:主要為媒體文件容器內的具體的數據對應的壓縮方式,例如音頻的aac壓縮數據,音頻的speex壓縮數據,視頻h264壓縮數據等,或ASS字幕數據等;
AvFilters:主要為媒體的音頻數據,視頻數據進行渲染,例如多個視頻文件視頻數據前景與背景進行疊加、透明處理、音頻重采樣、音頻合並等處理;
AvDevices:主要為媒體的播放輸出設備,媒體的采集設備,例如音頻采集設備,音頻輸出設備,視頻的采集設備,視頻的輸出設備等;
Utils:主要為FFmpeg中的AVFormats,AVCodecs,AVFilters等所用到的公用的接口;
Swscale: 主要為FFmpeg中做縮放,rgb轉yuv,混色計算等用的接口。


1.1 FFmpeg 的封裝模塊avformat
libavformat中實現了目前多媒體領域中的幾乎所有封裝格式,可以封裝,可以解封裝,根據需求不同,所支持的也有所不同,ffmpeg能否支持一種封裝格式的視頻的封裝與解封裝,完全取決於這個庫,例如mp4、flv、mkv等容器的封裝與解封裝;又或者RTMP、RTSP、TCP、UDP等協議的封裝與解封裝;關於封裝與解封裝的操作,對CPU的消耗不會特別嚴重,因為封裝與解封裝不涉及到復雜的計算,更多的是I/O,如果希望增加自己定制的封裝格式的話,需要在libavformat中增加自己的對應的format模塊。通過代碼的文件結構可以看得出來

1.2 FFmpeg 的編解碼模塊libavcodec
libavcodec中實現了目前多媒體領域幾乎所有的編解碼格式,可以編碼,可以解碼,不過有些編碼需要使用第三方的編碼器,例如H.264(AVC)編碼需要使用x264編碼器,H.265(HEVC)編碼需要使用x265編碼器,mp3(mp3lame)編碼需要使用libmp3lame編碼器等編碼器,ffmpeg本身同時也支持多種編碼格式,例如mpeg4、aac、mjpeg等編碼,如果希望增加自己的編碼格式,或者硬件編解碼,需要在libavcodec中增加自己的codec模塊,關於更多libavcode相關的信息以及使用信息將會在後面章節進行詳細的介紹。

1.3 FFmpeg 的萬金油libavfilter
Libavfilter 庫提供了一個通用的 音頻 / 視頻濾鏡框架,處理一些濾鏡相關的操作。在 libavfilter中,濾鏡框架可以有多個輸入和多個輸出。為了說明的各種存在的場景,我們參考一下下面這個filtergraph例子:

圖中這個例子中的filtergraph講輸入的視頻切割成了兩部分流,一部分流拋給crop與vclip進行操作,另一部分保持原樣,當crop與vflip操作完成後,將流合並到原有的overlay中,並顯示在最上面一層,輸出新的視頻,對應的命令行如下:

  1. ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT
下面看一下具體的執行情況,用來驗證該命令的可行性:

運行後生成的視頻結果將是視頻的上半部分鏡像到底部一半的輸出視頻;下面詳細說明一下規則:
1.相同的Filter線性鏈由逗號分隔
2.不同的Filter線性鏈之間用分號分隔
在圖示例中,crop與vflip使用的是同一個Filter線性鏈,split和overlay使用的是另外一個線性鏈,線性鏈接入到另一個線性鏈匯合處時是通過方括號’[]’括起來的標簽進行標示的。在這個例子中,兩個流處理後是通過[main]與[tmp]進行關聯匯合的。
split filter將分割後的視頻流的第二部分分配給濾鏡,打上標簽[tmp],將該部分流通過crop filter進行處理,然後進行縱坐標調換操作,打上標簽[flip],然後將main與flip進行合並,flip標簽的視頻流顯示的時候從視頻的左邊最中間的位置開始顯示,就出現了鏡像效果。
可以對比一下運行的前後效果:
首先代表花果山致以忠誠的問候:bbs.chinaffmpeg.com 孫悟空


1.4 FFmpeg 的視頻圖像轉換計算模塊libswscale
FFmpeg 的libswscale 模塊提供了高級別的圖像轉換API接口。特別是,它允許一個進行圖像縮放和像素格式轉換。常見於將圖像從1080p轉換成720p或者480p等縮放,或者將圖像數據從yuv420p轉換成yuyv,或者yuv轉rgb等圖像格式轉換。

1.5 FFmpeg 的音頻轉換計算模塊libresample
FFmpeg 的libresample 模塊提供了高級別的音頻重采樣API接口。特別是,它允許一個執行音頻采樣、 音頻通道布局 rematrixing 和轉換的音頻格式和包裝布局

1.6 FFmpeg 的編解碼工具ffmpeg
關於ffmpeg的介紹,可以在網上搜索到很多,本節主要介紹實戰,通過實戰對ffmpeg進行了解會更加深刻,下面看一個例子:
ffmpeg -i input.mp4 output.avi
執行過程輸出:

這是一條最簡單的ffmpeg命令,可以看到,ffmpeg通過-i參數將input.mp4作為輸入源輸入,然後進行了轉碼與轉封裝操作,輸出到output.avi中。這條命令最主要做了如下工作:
1.獲得輸入源input.mp4
2.輸出文件output.avi
看似簡單的兩步主要的工作,其實遠遠不止是從後綴名為mp4的文件輸出後綴名為avi的文件,因為在ffmpeg中,mp4與avi是兩種流媒體格式,並不是後綴名所可以決定的,例如上面上的命令行同樣可以這樣寫:
ffmpeg -i input.mp4 -f avi output.dat
執行過程輸出:

這條ffmpeg命令相對前面的那條命令做了一些改變,加了一個“-f”進行約束,“-f”參數的工作非常重要,它制定了輸出的文件的容器格式,所以可以看到輸出的文件為output.dat,文件後綴為.dat,但是其主要工作依然與之前的指令相同。
分析兩個圖中的Output #0部分,可以看到都是avi,只是輸出的文件名不同,其他內容均相同。
ffmpeg的工作主要流程也相對比較簡單:
1.解復用(Demuxing)
2.解碼(Decoding)
3.編碼(Encoding)
4.復用(Muxing)

其中需要經過5個步驟:
1.讀取輸入源
2.讀取編碼的數據包
3.解碼每一幀數據
4.輸出每一幀編碼
5.輸出到目標
整體工作流程與步驟可以通過流程圖繪制出來:

根據圖中的轉碼工作流程可以看出,首先ffmpeg讀取輸入源,然後通過Demuxer將音視頻包分解開,這個動作通過調用libavformat中的接口即可實現,接下來通過Decoder進行解碼,將音視頻通過Decoder解包成為YVU或者PCM這樣的數據,這個Decoer通過libavcodec中的接口即可實現,然後將對應的數據通過Encoder進行編碼,編碼可以通過libavcodec中的接口進行實現,接下來將編碼後的音視頻數據包通過Muxer進行封裝,Muxer封裝通過libavformat中的接口即可實現,輸出成為輸出流。


1.7 FFmpeg的播放器ffplay
FFmpeg不但可以提供轉碼轉封裝等功能,同時還提供了播放器相關的功能,使用FFmpeg的avformat與avcodec,可以播放各種媒體文件或者流。如果想要使用ffplay,系統首先需要有一個SDL庫來進行ffplay的基礎支撐。
ffplay與ffmpeg在FFmpeg項目中充當的角色基本相同,主要為Demo與測試使用的工具,使用ffplay可以看到一些音視頻相關的圖像信息,音頻的波形信息等。


1.8 FFmpeg的多媒體分析器ffprobe
FFmpeg項目中的ffprobe是一個非常強大的多媒體分析工具,可以從媒體文件或者媒體流中獲得到你想要了解到的媒體信息,比如音頻的參數,視頻的參數,媒體容器的參數信息等。
例如分析某個媒體容器中的音頻是什麼編碼格式,視頻是什麼編碼格式,同時還可以得到媒體文件中媒體的總時長,復合碼率等信息。
使用ffprobe還可以分析媒體文件中的每個包的長度,包的類型,幀的信息等。下面舉一個例子來看一下,對ffprobe會有一個基本的概念:

根據圖中可以看到,使用ffprobe能夠查看到mp4文件容器中的流的信息,包含了一個視頻流,由於該文件中只有視頻流,流相關的信息通過[STREAM][/STREAM]的方式展現出來,在[STREAM]與[/STREAM]之間的信息為該mp4文件的視頻流信息。當視頻文件容器中包含音頻流與視頻流或者更多路流時,會通過[STREAM]與[/STREAM]進行多個流的分隔,分割後區分流的索引信息采用的是index來進行區分。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved