FFMpeg筆記(六) 濾鏡命名規則及使用libavfilter對視頻尺寸進行裁切


    在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM