FFmpeg濾鏡使用

  濾鏡(filter)詳細介紹參考官方文檔

  常用的濾鏡功能,像圖像加水印/字幕、去logo、圖形旋轉縮放等,但濾鏡不僅僅包括視頻部分,還包括音頻處理的,像變聲變調、聲場控制(重低音/留聲機/搖滾等效果)。

  下面介紹濾鏡類中常用命令,該博文長期更新。

Key1. 去除水印

  該需求實現分為兩步:step1.確認水印位置和效果;step2.位置和效果反覆調整合適了,再轉碼。

  step1. ffplay.exe -i Tuesday00.mp4 -vf delogo=x=30:y=40:w=350:h=60:show=1,scale=640×480

     -vf指視頻的濾鏡處理,後面跟參數(水印區域:x/y/w/h,是否圈住區域:show,縮放處理:scale),注意各參數間用”逗號”分隔。

        如果不想縮放處理,但是視頻w/h太大了,以至於超出了顯示器顯示區域的範圍,可以控制播放窗口的大小。使用-x或-y指定播放窗口的寬或高。

  step2. ffmpeg.exe -i Tuesday00.mp4 -vf delogo=x=30:y=40:w=350:h=60:show=0,scale=640×480 -c:v libx264 -c:a copy output.mp4

        嘗試了多次,確定好區域後,可以進行轉碼了。注意一點,show要關掉(show=0),video轉碼參數(-c:v libx264)可以不帶,系統默認使用x264編碼。

Key2. 去除某個時間段的水印

  在上面Key2.step2命令中增加時間控制信息: -ss 5 -t 10(從第5秒開始,持續10s,共10秒鐘長的視頻)

  注意:「-ss 5 -t 10」參數,對於ffmpeg來說,放在input_file前和後貌似沒什麼差別,都是轉成10秒鐘長度的視頻文件。

  另外一點增強型需求:假如有多個時間段需要去除水印,例如,第0-15秒之間某個區域需要去除,還有20-30秒之間的另外一個區域水印去除。

  這個需求的方法還沒找到,有知道的同學們麻煩告知一下。目前我使用了比較笨的方法,就是多次轉碼。

Key3.  多個區域去水印

  在Key1中的step1命令中再增加一個delogo參數,即命令為:ffplay.exe -i Tuesday00.mp4 -vf delogo=x=30:y=40:w=350:h=60:show=1,delogo=x=230:y=240:w=350:h=60:show=1 -y 300

  確定好位置後,再用ffmpeg轉碼。

Key4.  添加文字水印

  與Key1類型,先用ffplay確認位置和效果,再用ffmpeg進行濾鏡+轉碼。

       step1. ffplay.exe -i Tuesday00.mp4 -vf “drawtext=fontfile=msyh.ttc:text=’Hello,world’:x=30:y=60:fontsize=120:fontcolor=yellow”

       注意,本地的字體文件(fontfile=msyh.ttc)可以不指定,找不到了用系統使用默認的。

  step2. ffmpeg.exe -i Tuesday00.mp4 -vf “drawtext=fontfile=msyh.ttc:text=’Hello,world’:x=30:y=60:fontsize=120:fontcolor=yellow” output.mp4

Key5. 給視頻添加封面

  其實是將指定圖片作為視頻的前幾幀(只指定為第一幀時,有的平台可能不使用首幀作為縮略圖則達不到效果)。核心思想是,圖片轉為含若干幀的視頻流,再跟主視頻合併。

  step1. ffmpeg.exe -r 25 -loop 1 -i img.jpg -vcodec libx264 -s 720×1280 -frames 25 -r 25 img_25f.mp4

        其中,參數”-r 25 -loop 1″代表以25fps速度反覆讀取輸入文件。參數”-frames 25″指只編碼25幀,”-r 25″指定輸出文件幀率為25fps。那麼命令結果是,生成了1秒鐘的視頻文件(用工具分析文件,會發現:第一幀的關鍵幀size較大,後面的B/P幀非常小,只有10+Bytes大小)。

  step2. ffmpeg -f concat -i concat.txt -c copy output.mp4

        其中,參數”-f concat”指視頻合併;參數”-i concat.txt”指定輸入文件列表,如下格式:

file input1.mp4

file input2.mp4

Key6. 將視頻放在黑板上

  另外一種說法是,將視頻放在幕布上。

  ffmpeg -i input.mp4 -vf pad=720:1280:100:200:black output.mp4

  其中,參數”pad=720:1280:100:200″指定了幕布的寬/高以及視頻(左上角)放置在該幕布中的位置,參數”black”指定了幕布的顏色。

  另外一點需注意,視頻不能超出了幕布區域,否則出錯。