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