FFmpeg 內置的一個無中生有的音視頻輸入數據

2022-01-30 流媒體技術

背景

相信很多人在遇到音視頻處理的時候,或者做音視頻數據測試的時候,會因為把握不好音視頻輸入源的而苦惱。當然,有的人有很多種子的可能不但不會苦惱而且還會很歡樂。可是我們用在工作中的測試視頻,總不能拿那些用種子下載下來的葫蘆娃、黑貓警長、汪汪隊立大功來測試吧?畢竟那是有版權的視頻,拿來亂用也不太合適。而開放版權測試素材也有,但是並不多,例如大雄兔(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色彩圖像基礎知識,根據寬高在畫布中繪製步驟也已經在代碼中有注釋。

相關焦點

  • ffmpeg音視頻框架的簡介
    ffmpeg是多媒體領域應用最廣泛的一個開源框架,包含了傳輸協議、視頻格式、編解碼、圖像濾鏡、語音處理等功能,並可以與cuda、opencv等這個領域的其他軟體對接,幾乎是事實上的音視頻標準庫。ffmpeg是圍繞這8個參數處理的,其中dts一般不需要過於關注,重點是pts,它確定了音視頻的每一幀的播放時間。
  • ffmpeg的avfilter簡介
    每一個濾鏡都是一個AVFilter,實際處理時多個濾鏡組合成一個圖(filter graph)進行處理。對具體的濾鏡鏈的調用,由ffmpeg的avfilter框架完成。如下4張圖是AVFilter的數據結構。
  • FFMPEG常用的一些命令介紹:音頻錄製、視頻錄製、視頻推流等
    3.1 ffmpeg命令介紹Ffmpeg源碼編譯完成之後,會生成一個ffmpeg可執行文件。
  • FFmpeg 編解碼處理-轉碼全流程簡介
    轉碼的核心功能在解碼和編碼兩個部分,但在一個可用的示例程序中,編碼解碼與輸入輸出是難以分割的。解復用器為解碼器提供輸入,解碼器會輸出原始幀,對原始幀可進行各種複雜的濾鏡處理,濾鏡處理後的幀經編碼器生成編碼幀,多路流的編碼幀經復用器輸出到輸出文件。1.1 解復用從輸入文件中讀取編碼幀,判斷流類型,根據流類型將編碼幀送入視頻解碼器或音頻解碼器。
  • 音視頻解碼器(LAV Filters)
    音視頻解碼器(LAV Filters) 媒體管理 大小: 12.2M
  • Android 相機,音視頻開發入門篇
    了解下OpenGl ES中的紋理OpenGl 中的紋理可以用來表示圖像,照片,視頻畫面等數據,在視頻渲染中,我們只需要處理二維的紋理,每個二維的紋理都由許多小的紋理元素組成,我們可以將其看成小塊的數據。我們可以簡單將紋理理解成電視牆瓷磚,我們要做一面電視牆,需要由多個小瓷磚磡成,最終成型的才是完美的電視牆。我暫時是這麼理解滴。使用紋理,最直接的方式是直接從給一個圖像文件加載數據。
  • Python3 使用you-get,youtube-dl,ffmpeg 下載全網視頻並剪切視頻
    現在視頻網站很多,我們看的視頻也越來越多了。有時候看到某些視頻的片段非常的不錯,想要剪切下來的衝動的次數也越來越多。一個視頻剪切倒還好,但是多個視頻的情況下,就比較麻煩了。所以本人用python寫了個腳本,只需要以下兩個步驟就可以按你所需要的下載並剪切視頻:(需自己安裝python3.6,ffmpeg,you-get,youtube-dl)一:新建個url.txt文件
  • 閱讀3分|ffmpeg無損轉換mp4到webm可不可行?為你揭曉答案
    引言webm 體積小質量高,想要把 mp4 視頻文件轉換過去,還要質量無損,使用 VP8/9編碼,ffmpeg能實現嗎?但是,我必須每次都要先確認輸入視頻的比特率(此處為1M)。當然,如果你把目標比特率,指定的值比輸入的比特率大得多(例如-b:v 100M),則ffmpeg 僅使用 vp9 輸入視頻的比特率,或者使用了比 vp8 略高的比特率。這樣要做無損轉換,似乎無解。
  • 基於 FFmpeg 的 Cocos Creator 視頻播放器
    只為解決一個核心問題,追求更好體驗。1. 背景2. 解決方案3. 任務細分4. 任務詳情4.1 移動端 ffplay 播放音視頻4.2 JSB 綁定視頻組件接口4.3 視頻展示,紋理渲染4.4 音頻播放4.5 優化與擴展5.
  • 作為一個Android程式設計師,精通音視頻開發,寒冬再冷也凍不到你
    而音視頻從業者基本上有兩個層面:一個層面是搞音視頻算法,這類人非常少,需要有深的數學能力和算法背景,這類人一般都會選擇去大公司,薪水百萬是最low 的。另一個層面是搞工程,這類人相對較多,他們有紮實的理論基礎,很強的技術功底,對音頻、視頻都非常熟悉。這些人工資要比一般開發者高20%左右;隨著5G時代的到來,音視頻慢慢變成人們日常生活中的必需品。
  • 音視頻技術開發周刊|172
    ,我們通常可以使用libx264, ffmpeg等第三方視頻編碼庫,但是如果對編碼的速度有一定的要求,要實現實時甚至超實時的高速視頻編碼,我們並沒有太多選項,只能使用Android提供的MediaCodec硬編碼模塊。
  • OpenCV ffmpeg移植到ARM平臺
    然後進行視頻圖像的幀處理。那麼如何用OpenCV讀寫ARM板上的視頻文件,並進行視頻處理呢?這該又將如何移植呢?本文引用地址:http://www.eepw.com.cn/article/201611/317669.htm這個就必須要裝x264,xvid和ffmpeg,和上一篇中講的通過V4L2底層函數獲取攝像頭視頻就有點不一樣了。
  • 如何編寫 FFmpeg 自動化測試用例(一)
    今天有個為 FFmpeg 貢獻高質量 patch 的朋友問到了一個問題,如何編寫一個 FATE 測試用例,當時簡單地回復了操作步驟,那麼接下來我將會在這裡詳細介紹一下如何編寫
  • FFmpeg 簡單合成 MP4 :視頻解封與重新封裝
    教程代碼:【Github傳送門:https://github.com/ChenLittlePing/LearningVideo】目錄一、Android音視頻硬解碼篇:二、使用OpenGL渲染視頻畫面篇三、Android FFmpeg音視頻解碼篇本文你可以了解到 利用 FFmpeg 對音視頻進行簡單的解封和重新封裝
  • B站最火數學視頻3Blue1Brown是如何製作的
    本人通過該視頻頻道獲得了很多啟發,同時也對其精良的視頻製作技術產生了濃厚的興趣。偶然的機會,得知其在Github上有專門開設了一個視頻製作引擎:manim。所以,突然想嘗試用一下該基於Python的可視化引擎,如果可以實現功能,以後就可以根據自己的需要利用該引擎進行動畫演示。
  • Windows下搭建FFmpeg開發調試環境
    背景如果你是一個FFmpeg的使用者,那麼絕大部分情況下只需要在你的程序中引用FFmpeg的libav*相關的頭文件,然後在編譯階段連結相關的庫即可。但是如果你想調試FFmpeg內部相關的邏輯,或者分析FFmpeg源碼,那麼有一個可供單步調試FFmpeg的環境往往能使你事半功倍!
  • 2020年ffmpeg最簡單的安裝教程,最多只需要3個命令
    ffmpeg是我們經常要使用到的工具了,但是安裝的時候也許你會出現缺少插件的情況,導致你的軟體無法使用。下面是我遇到的非常簡單的安裝教程,總共就用到了3個命令。li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm2.安裝FFmpeg 和 FFmpeg開發包sudo yum install ffmpeg
  • 音視頻開發之旅(八)GLSL及Shader的渲染流程
    學習一門語言首先看它的數據類型的表示,再學習具體的運行流程,由於運行流程上和C、Java等語言基本一致。所以我們來重點看看GLSL特有的數據類型的表示,從基本類型、修飾符、內置變量、內置函數四個方面說明。
  • HDMI DVI VGA色差 SDI 1080P輸入高清錄像機
    6、支持音視頻同步錄製。支持視頻與音頻不同輸入的音視頻同步錄製。  7、支持本機一鍵回放。支持邊放邊錄、邊錄邊放、具有時光平移功能。  8、支持拷貝到電腦進行播放、剪接、編輯。  9、兼容HDCP協議,支持錄製各類加密視頻。  10、HDT機型支持最高輸入解析度幀數為1080P24hz;WHD機型支持1080P60hz。