1. 程式人生 > >FFMpeg學習(六) 用libavfilter對視頻尺寸進行裁切

FFMpeg學習(六) 用libavfilter對視頻尺寸進行裁切

example doc 分享 col 參數 tails 環境 坐標 通過

在ffmpeg框架中,濾鏡(filter)功能通過libavfilter庫實現。 一個filter可以同時有多個輸入和輸出。以圖為例:

技術分享圖片

圖中的一系列操作共使用了四個filter,分別是
splite:將輸入的流進行分裂復制,分兩路輸出。
crop:根據給定的參數,對視頻進行裁剪
vflip:根據給定參數,對視頻進行翻轉等操作
overlay:將一路輸入覆蓋到另一路之上,合並輸出為一路視頻
整個過程的命令為下圖:

ffmpeg -i input.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2
" output.mp4

最終實現的效果是,視頻的上半部分水平翻轉,下半部分被覆蓋,輸出一個水平對稱的視頻。

命令行分析:splite有兩路輸出,分別被標簽標記為[main]和[tmp],在命令中,可以用這種形式來標記輸入輸出,在後面命令中,對被標記的輸出進行引用。其中一路輸出[tmp]作為輸入傳遞給crop。crop的參數格式為w:h:x:y,其中w、h為輸出視頻的寬和高,x、y標記輸入視頻中的某點,將該點作為基準點,向右下進行裁剪得到輸出視頻。示例中crop的參數為iw:ih/2:0:0,iw、ih分別為輸入流視頻的寬和高,因此該參數表明,以原視頻左上角為基準點,寬度不變,裁剪原視頻的上半部分

。從crop得到的輸出被傳遞給vflip,vflip對輸入做水平翻轉處理,得到輸出[flip]。然後將splite的另一路輸出[main]和[flip]一起傳遞給overlay,其中第一個輸入[main]為主流,第二個輸入[flip]是副流,overlay根據參數指定的規則將副流覆蓋於主流之上。該命令中overlay的參數為0:H/2,即[flip]左上角對齊[mian]的坐標為(0,H/2)的點進行覆蓋,H為[main]的高。

以上為ffmpeg濾鏡的基本使用方式。其中有一些命令的格式需要註意:

1、命令中同一個濾鏡鏈中的濾鏡之間通過逗號分隔開,如上例中[crop]和[vflip]處於同一個濾鏡鏈,而知以逗號分隔開。

2、不同的濾鏡鏈之間以分號隔開,如上例中[crop]和[vflip]組成的濾鏡鏈與[split]、[overlay]之間。

3、濾鏡鏈的輸入輸出通過方括號標記命名,若示例中[split]濾鏡產生了兩路輸出,分別被標記為[main]和[tmp]

4、有的濾鏡可以指定參數列表,通過在濾鏡名後面接一個等號,然後等號後指定需要的參數即可,不同的參數之間需要使用冒號隔開。如示例中[crop]的參數iw:ih/2:0:0

如果僅僅需要尺寸裁切,那麽可以單獨使用crop命令:

ffmpeg -i testInput.mp4 "crop=cropWidth:cropHeight:cropX:cropY"  testOutput.mp4

其中cropWidth, cropHeight為視頻裁切後的長寬,cropX, cropY為視頻裁切的左上角。

Tips:

1. 工程中如果需要對視頻進行尺寸裁切,那麽需要先將源視頻解碼,解碼後的AVFrame作為avfilter的輸入,crop字符串作為filter_description,具體實現可以參考FFmpeg源碼中的FFmpeg\doc\examples\filtering_video.c文件;

2. 寫代碼時遇到問題,調試不出來時,可以搭建一下FFmpeg的調試環境,用命令行啟動,調試到FFmpeg內部查看變量的值與自己寫的代碼有何區別。Mac下搭建調試環境:https://www.jianshu.com/p/226c19aa6e42。

部分內容轉載自:https://blog.csdn.net/joee33/article/details/51946712

FFMpeg學習(六) 用libavfilter對視頻尺寸進行裁切