背景
相信很多人在遇到音視頻處理的時候,或者做音視頻數據測試的時候,會因為把握不好音視頻輸入源的而苦惱。當然,有的人有很多種子的可能不但不會苦惱而且還會很歡樂。可是我們用在工作中的測試視頻,總不能拿那些用種子下載下來的葫蘆娃、黑貓警長、汪汪隊立大功來測試吧?畢竟那是有版權的視頻,拿來亂用也不太合適。而開放版權測試素材也有,但是並不多,例如大雄兔(Big Buck Bunny),長這樣:
還有一個鋼鐵之淚(Tears of Steel),長這樣:
除了這些,再就是常見的花花公子經典照片Lena這種圖片了。而視頻呢,上面兩種應該是比較常用的,其實也不太夠用,尤其是想要逐幀確認,或者測試音頻之類的情況的時候,並且這些視頻一直在電腦裡存著也挺佔地方的,現場下載也挺浪費時間的,所以 FFmpeg 提供了一組雖然看上去不那麼美觀,但是應該足夠用調試和測試用的視頻源數據生成的方法。
初步講解
首先如果信息的朋友,或者是在用ffmpeg的時候用過這條命令查看ffmpeg在當前電腦中支持的設備的時候,應該能夠看到這樣的輸出信息:
(base) liuqideMacBook-Pro:ffmpeg liuqi$ ffmpeg -hide_banner -devicesDevices: D. = Demuxing supported .E = Muxing supported -- E audiotoolbox AudioToolbox output device D avfoundation AVFoundation input device D lavfi Libavfilter virtual input device E sdl,sdl2 SDL2 output device(base) liuqideMacBook-Pro:ffmpeg liuqi$其實吧,這樣的命令行在《FFmpeg 從入門到精通》中也有介紹,只是好多人可能只顧著吐槽命令行太多,而忽略了輸出內容的有用性和知識的有用性,其中Demuxing在這裡是輸入設備的意思,Muxing在這裡是輸出設備的意思。那麼從這條命令的輸出信息中可以看到,輸入設備支持avfoundation和lavfi,avfoundation如果你用的是蘋果電腦,這個就是蘋果設備採集桌面、攝像頭、音頻採集設備(為啥我不說麥克風呢?因為現在好多槓精很會槓,你說麥克風他可能會說小愛同學、小度小度、你好小迪這種音頻採集設備,所以叫音頻採集設備是為了『泛』一下,儘量讓槓精無逼可裝),這些不是重點,看一下另外一個輸入設備 -- lavfi,從後面的說明信息可以知道,他是一個用libavfilter虛擬的輸入設備,明面文字已經很好理解了,他是一個輸入設備,而且是虛擬的,那麼我們看一下這個虛擬設備咋用。
這個設備沒有list_devices參數,有興趣的朋友可以考慮給ffmpeg加一個,或者等我們有空的時候加一個,目前看上去只能看文檔了
音頻的在這:
https://ffmpeg.org/ffmpeg-filters.html#Audio-Sources可用的源有這些:
abufferaevalsrcafirsrcanullsrcfliteanoisesrchilbertsincsine視頻的在這:
https://ffmpeg.org/ffmpeg-filters.html#Video-Sources可用的源有這些:
buffercellautocoreimagesrcgradientsmandelbrotmptestsrcfrei0r_srclifeallrgb, allyuv, color, haldclutsrc, nullsrc, pal75bars, pal100bars, rgbtestsrc, smptebars, smptehdbars, testsrc, testsrc2, yuvtestsrcopenclsrcsierpinski因為源太多,就不一一講解了,隨便找幾個舉舉例子,剩下的大夥可以自己挨個嘗試了解。
進一步講解
音頻我們舉兩個例子,其中有一個在咱們這個公眾號的歷史分享中音頻處理相關的內容中有用到。
靜音源 - anullsrc
當我們想要給音頻加一個靜音背景的時候,用這個濾鏡比較好,我們可以試一下:
ffmpeg -f lavfi -i anullsrc=r=48000:cl=mono -acodec aac -r:a 48000 -b:a 128k output.aac這樣的話,將會生成一個靜音的音頻內容,採樣率是48000 hz,聲道布局是front center。
表達式生成音頻數據 -- aevalsrc
當我們想要自己生成一個耳朵能聽到的聲音的時候,用這個濾鏡比較好,而且生成音頻的表達式我們可以自己根據個人喜好調整。我們可以試一下:
ffmpeg -f lavfi -i aevalsrc="sin(440*2*PI*t):s=8000" -acodec aac -r:a 8000 -b:a 128k output.aac這樣的話將會生成頻率為 440 hz 的正弦信號,採樣率設置為 8000 hz:
以上兩種音頻生成的方式都可以與其他音頻通過音頻濾鏡混合使用,例如amerge、amix等。
這些源還有一些額外的參數可以設置:
n 採樣數信息t 生成音頻的總時長,從0開始計算s 音頻採樣率cl channel layout設置,個別音頻源支持如果想快速驗證其他音頻源的信息並且不想生成文件的話,可以用ffplay挨個試試看:
ffplay -f lavfi -i aevalsrc="sin(440*2*PI*t):s=8000"純色視頻源 -- color
當我們想要生成一個純色的視頻,例如黑色,例如紅色,例如綠色的視頻,可以考慮使用color設備源,如果生成純紅色的視頻,試一下:
ffmpeg -hide_banner -f lavfi -i color=c=red:s=176x144 -vcodec libx264 -t 1 -y out.mp4這樣的話會生成一個紅色,解析度是176x144的1秒鐘的視頻,看一下效果:
帶時間及幀序信息源 -- testsrc2
當我們不確定編解碼器是否有丟幀,或者想跟一下幀序,或者了解一下視頻圖像前後序列相關的信息的時候,可以用testsrc2這個源,這個源可以生成比較複雜的視頻,有運動,有彩條,有時間信息,有幀序號。試一下:
ffmpeg -hide_banner -f lavfi -i testsrc2=s=1280x720 -vcodec libx264 -y -t 5 output.mp4這樣的話會生成一個解析度為1270x720的視頻5秒鐘的視頻,看一下效果:
左上角是視頻的時間信息、幀序列信息,其他部分是視頻測試的彩條,運動相關的內容。
這些源還有一些額外的參數可以設置:
c 顏色,比如red紅色,blue藍色,yellow黃色,ffmpeg -colors可以看到顏色信息,這個用於純色源s 解析度,比如176x144,1280x720,1920x1080 blablaxblablad 總時長,從0開始算r 幀率,一秒鐘幾圖像其他還需要自己看文檔,目前看這幾個應該夠大部分場景用了。
深度了解一些
那就得看原始碼了,都是像素內容生成的,文件在這裡:
算法和技巧類的內容,自己看吧,挨個講解太鬧心。testsrc2關鍵圖像生成內容在這裡:
需要有一定的RGB色彩圖像基礎知識,根據寬高在畫布中繪製步驟也已經在代碼中有注釋。