這兩天研究了FFmpeg獲取DirectShow設備數據的方法,在此簡(jiǎn)單記錄一下以作備忘。本文所述的方法主要是對應Windows平臺的。
命令執行后輸出的結果如下(注:中文的設備會(huì )出現亂碼的情況)。列表顯示設備的名稱(chēng)很重要,輸入的時(shí)候都是使用“-f dshow -i video="{設備名}"”的方式。
我自己的機器上列出了以下設備:
下文的測試中,使用其中的兩個(gè)視頻輸入:"Integrated Camera"和"screen-capture-recorder"。
注:音頻設備出現亂碼,這個(gè)問(wèn)題還沒(méi)有解決。
下面這條命令,實(shí)現了從攝像頭讀取數據并編碼為H.264,最后保存成mycamera.mkv。
使用ffplay可以直接播放攝像頭的數據,命令如下:
如果設備名稱(chēng)正確的話(huà),會(huì )直接打開(kāi)本機的攝像頭,如圖所示。
注:除了使用DirectShow作為輸入外,使用VFW也可以讀取到攝像頭的數據,例如下述命令可以播放攝像頭數據:
下面這條命令,實(shí)現了:獲取攝像頭數據->編碼為H.264->封裝為UDP并發(fā)送至組播地址。
注1:考慮到提高libx264的編碼速度,添加了-preset:v ultrafast和-tune:v zerolatency兩個(gè)選項。
注2:高分辨率的情況下,使用UDP可能出現丟包的情況。為了避免這種情況,可以添加–s 參數(例如-s 320x240)調小分辨率。
下面這條命令,實(shí)現了:獲取攝像頭數據->編碼為H.264->封裝為RTP并發(fā)送至組播地址。
注1:考慮到提高libx264的編碼速度,添加了-preset:v ultrafast和-tune:v zerolatency兩個(gè)選項。
注2:結尾添加“>test.sdp”可以在發(fā)布的同時(shí)生成sdp文件。該文件可以用于該視頻流的播放。
下面這條命令,實(shí)現了:獲取攝像頭數據->編碼為H.264->并發(fā)送至RTMP服務(wù)器。
與編碼為H.264類(lèi)似,指明-vcodec即可。
播放MPEG2的UDP流如下。指明-vcodec為mpeg2video即可
Linux下使用FFmpeg進(jìn)行屏幕錄制相對比較方便,可以使用x11grab,使用如下的命令:
詳細時(shí)使用方式可以參考這篇文章:DesktopStreaming With FFmpeg for Lower Latency
Linux錄屏在這里不再贅述。在Windows平臺下屏幕錄像則要稍微復雜一些。在Windows平臺下,使用-dshow取代x11grab。一句話(huà)介紹:注冊錄屏dshow濾鏡(例如screen-capture-recorder),然后通過(guò)dshow獲取錄屏圖像然后編碼處理。
因此,在使用FFmpeg屏幕錄像之前,需要先安裝dshow濾鏡。在這里推薦一個(gè)軟件:screen capture recorder。安裝這個(gè)軟件之后,就可以通過(guò)FFmpeg屏幕錄像了。
screen capture recorder項目主頁(yè):
http://sourceforge.net/projects/screencapturer/
下載地址:
http://sourceforge.net/projects/screencapturer/files
下載完后,一路“Next”即可安裝完畢。注意,需要Java運行環(huán)境(Java Runtime Environment),如果沒(méi)有的話(huà)下載一個(gè)就行。
screen capture recorder本身就可以錄屏,不過(guò)這里我們使用FFmpeg進(jìn)行錄屏。
下面的命令可以將屏幕錄制后編碼為H.264并保存為本地文件。
注:“-r 5”的意思是把幀率設置成5。
最后得到的效果如下圖。
此外,也可以錄聲音,聲音輸入可以分成兩種:一種是真人說(shuō)話(huà)的聲音,通過(guò)話(huà)筒輸入;一種是虛擬的聲音,即錄屏的時(shí)候電腦耳機里的聲音。下面兩條命令可以分別錄制話(huà)筒的聲音和電腦耳機里的聲音。
錄屏,伴隨話(huà)筒輸入的聲音
上述命令有問(wèn)題:audio那里有亂碼,把亂碼ANSI轉UTF-8之后(亂碼變成“內裝麥克”)依然不行,這個(gè)問(wèn)題先留著(zhù),以后有時(shí)間再解決。
PS:感覺(jué)這條命令適合做講座之類(lèi)的時(shí)候使用
錄屏,伴隨耳機輸入的聲音
PS:測這條命令的時(shí)候,這在聽(tīng)歌,因此錄制的視頻中的音頻就是那首歌曲。
下面的命令可以將屏幕錄制后編碼為H.264并封裝成UDP發(fā)送到組播地址
注1:考慮到提高libx264的編碼速度,添加了-preset:v ultrafast和-tune:v zerolatency兩個(gè)選項。
注2:高分辨率的情況下,使用UDP可能出現丟包的情況。為了避免這種情況,可以添加–s 參數(例如-s 320x240)調小分辨率。
下面的命令可以將屏幕錄制后編碼為H.264并封裝成RTP并發(fā)送到組播地址
注1:考慮到提高libx264的編碼速度,添加了-preset:v ultrafast和-tune:v zerolatency兩個(gè)選項。
注2:結尾添加“>test.sdp”可以在發(fā)布的同時(shí)生成sdp文件。該文件可以用于該視頻流的播放。如下命令即可播放:
原理同上,不再贅述。
注意:播放RTMP的時(shí)候,-max_delay參數會(huì )比較明顯的影響延遲,將此參數值設定小一些,有利于降低延時(shí)。
聯(lián)系客服