FFmpeg全名是Fast Forward MPEG(Moving Picture Experts Group),為開源的影音多媒體處理框架,可以進行影音的解碼、編碼、編碼轉換、混合、抽取、串流和濾鏡,無論影音格式是從哪個地方出來的,從過去到現在的影音格式它幾乎都能夠支援。作為專業處理影音的FFmpeg,當然也可以將聲音轉成影像,做出具有藝術視覺效果的音樂。



不過,FFmpeg對於聲音視覺化這方面的功能並不強。以下會介紹幾個筆者覺得還算堪用的相關濾鏡。

avectorscope

適用於雙聲道音樂,會計算不同聲道訊號的差(difference)來做視覺化。如果輸入的是單聲道的聲音,則不能正常變化。

指令寫法如下:

ffmpeg -i 輸入的聲音檔案路徑 -filter_complex "[0:a]avectorscope=m=lissajous:s=1080x1080:r=60:rc=40:gc=160:bc=80:ac=255:rf=15:gf=10:bf=5:af=5:zoom=1:draw=line:scale=log,format=yuv420p,pad=1920:1080:(ow-iw)/2:(oh-ih)/2[outv]" -map "[outv]" -map 0:a 輸出的影片路徑

視覺效果演示:

avectorscope濾鏡有以下幾個比較重要的參數:

  • m:設定圖形的樣式。
    • lissajous:聚集在中央,向四周散開。如上面的演示就是使用這個樣式。
    • polar:聚集在底部,向四周散開。
  • s:設定圖形的尺寸。如果m=lissajous,尺寸用正方形會比較好,大小可設為影片解析度大小的最小邊,並搭配pad濾鏡來置中。如果m=polar,尺寸可設得跟影片解析度大小一樣。
  • r:設定影片的幀數。建議設為60以上,看起來才滑順~
  • rcgcbcac:設定圖形的顏色,分別是紅、綠、藍、透明度的值。數值範圍是整數0~255。
  • rfgfbfaf:設定圖形淡出的顏色,分別是紅、綠、藍、透明度的值。數值範圍是整數0~255。
  • zoom:圖形的縮放。數值愈小放得愈大,數值範圍是浮點數0~10。
  • draw:圖形組成方式。line是用線組成;dot是用點組成,不是很好看。
  • scale:設為log,圖形會比較有明顯變化。

m=polar的指令寫法:

ffmpeg -i 輸入的聲音檔案路徑 -filter_complex "[0:a]avectorscope=m=polar:s=1920x1080:r=60:rc=40:gc=160:bc=80:ac=255:rf=15:gf=10:bf=5:af=5:zoom=1:draw=line:scale=log,format=yuv420p[outv]" -map "[outv]" -map 0:a 輸出的影片路徑

m=polar的視覺效果演示:

如果要加上背景圖,以m=lissajous為例,指令寫法如下:

ffmpeg -i 輸入的聲音檔案路徑 -loop 1 -r 60 -i 輸入的圖片檔案路徑 -filter_complex "[0:a]avectorscope=m=lissajous:s=1080x1080:r=60:rc=40:gc=160:bc=80:ac=255:rf=15:gf=10:bf=5:af=5:zoom=1:draw=line:scale=log[fg];[1:v][fg]overlay=(W-w)/2:(H-h)/2[outv]" -map "[outv]" -map 0:a -shortest 輸出的影片路徑

以上指令,利用overlay濾鏡將視覺化圖形疊在輸入的圖片上,並順便置中。

m=lissajous疊上背景圖的視覺效果演示:

showwaves

適用於單聲道或多聲道音樂,即一般常見的聲音波形圖。

指令寫法如下:

ffmpeg -i 輸入的聲音檔案路徑 -filter_complex "[0:a]pan=mono|c0=.5*c0+.5*c1,showwaves=s=1920x1080:mode=cline:r=60:colors=#FF0000:scale=log:draw=scale,format=yuv420p[outv]" -map "[outv]" -map 0:a 輸出的影片路徑

以上指令之所以用pan聲音濾鏡來永遠將輸入的雙聲道聲音轉成單聲道,是因為showwaves濾鏡在處理多聲道的時候會用無法自訂的顏色把多聲道的波形疊在一起,不太好看。

視覺效果演示:

showwaves濾鏡有以下幾個比較重要的參數:

  • s:設定波形顯示的尺寸。
  • mode:建議設為cline,其它的看起來很詭異。
  • r:設定影片的幀數。建議設為60以上,看起來才滑順~
  • colors:波形的顏色。
  • scale:設為log,圖形會比較有明顯變化。
  • drawscale可以讓波形無論在大或小音量的時候看起來都活躍;full則是會完全依照聲音的音量來繪製波形。

事實上,showwaves濾鏡是可以將多個聲道分開繪製的,但筆者覺得這個不是我們平常在一邊聽音樂一邊看視覺化的效果時會想看到的。就不介紹這個功能了。

如果要加上背景圖,指令寫法如下:

ffmpeg -i 輸入的聲音檔案路徑 -loop 1 -r 60 -i 輸入的圖片檔案路徑 -filter_complex "[0:a]pan=mono|c0=.5*c0+.5*c1,showwaves=s=1920x300:mode=cline:r=60:colors=#FF0000:scale=log:draw=scale[fg];[1:v][fg]overlay=(W-w)/2:H-h[outv]" -map "[outv]" -map 0:a -shortest 輸出的影片路徑

以上指令,showwaves濾鏡所產生出來的圖形尺寸比影片的解析度(即輸入的圖片尺寸)還要小,利用overlay濾鏡將視覺化圖形疊在輸入的圖片上,並順便置中、置底。

疊上背景圖的視覺效果演示:

showfreqs

適用於單聲道或多聲道音樂,即一般常見的聲音頻譜圖(非時頻圖)。

指令寫法如下:

ffmpeg -i 輸入的聲音檔案路徑 -filter_complex "[0:a]pan=mono|c0=.5*c0+.5*c1,showfreqs=r=60:s=1920x1080:mode=bar:colors=#0000FF:ascale=log:fscale=lin:win_size=64,format=yuv420p[outv]" -map "[outv]" -map 0:a 輸出的影片路徑

以上指令之所以用pan聲音濾鏡來永遠將輸入的雙聲道聲音轉成單聲道,也是因為showfreqs濾鏡在處理多聲道的時候會用多個顏色把多聲道的波形疊在一起,不太好看。

視覺效果演示:

showfreqs濾鏡有以下幾個比較重要的參數:

  • r:設定影片的幀數。建議設為60以上,看起來才滑順~
  • s:設定頻譜顯示的尺寸。
  • mode:建議設為bar,其它的看起來很詭異。
  • colors:頻譜的顏色。
  • ascale:設為log,圖形會比較有明顯變化。
  • fscale:設為lin,會比較符合看頻譜的習慣。
  • win_size:頻譜要切多細,數值愈高愈細。數值範圍是整數16~65536。上面的演示是使用win_size=64

win_size=2048的視覺效果演示: