寫在前面
如果您對音視頻技術(shù)感興趣,可以訂閱我的專題:音視頻專輯
也可以關(guān)注我的簡書賬戶: 張芳濤,我后期會發(fā)布更多的音視頻以及圖像處理方面的文章。
正文
麥克風(fēng)和網(wǎng)絡(luò)攝像頭(網(wǎng)絡(luò)攝像頭)是計算機設(shè)備的常用部分,而FFmpeg包含了它們的使用元素。
輸入設(shè)備介紹
FFmpeg可以識別麥克風(fēng)和網(wǎng)絡(luò)攝像頭等輸入設(shè)備,這些輸入設(shè)備被定義為可以從附加的多媒體設(shè)備訪問數(shù)據(jù)的元素。 在Windows上,麥克風(fēng)和網(wǎng)絡(luò)攝像頭可通過dshow輸入設(shè)備進行訪問,如表中所述:

| 描述 | 在Windows操作系統(tǒng)上的輸入設(shè)備,支持的是音頻和視頻設(shè)備 |
|---|---|
| 語法 | options type=media_type[:type=media_type] []中的參數(shù)是可選的 |
| 類型參數(shù)的描述 | |
| type | 值可以是視頻或音頻 |
| 選項參數(shù)的可用值 | |
| audio_buffer_size | 音頻設(shè)備緩沖區(qū)大?。ㄒ院撩霝閱挝唬芍苯佑绊懷舆t,取決于設(shè)備),默認(rèn)使用設(shè)備的默認(rèn)緩沖區(qū)大小(通常為500ms的倍數(shù))。 將此值設(shè)置得過低可能會降低性能 |
| audio_device_number | 具有相同名稱的設(shè)備的音頻設(shè)備號(從0開始,默認(rèn)為0) |
| channels | 捕獲音頻中的通道數(shù) |
| framerate | 在拍攝的視頻中幀頻 |
| list_devices | 如果設(shè)置為1,則打印設(shè)備列表并退出 |
| list_options | 如果設(shè)置為1,則打印選定設(shè)備的選項列表并退出 |
| pixel_format | 像素格式的使用,只有在視頻編解碼器沒有設(shè)置或設(shè)置為rawvideo時才能設(shè)置 |
| sample_rate | 捕獲音頻的采樣率(在Hz中) |
| sample_size | 捕獲音頻的樣本大小(二進制) |
| video_device_number | 同名設(shè)備的視頻設(shè)備編號(從0開始,默認(rèn)為0) |
| video_size | 視頻大小在捕獲的視頻 |
可用的相機和麥克風(fēng)的列表
便攜式電腦有一個內(nèi)置的攝像頭,或者我們可以通過USB接口連接到電腦。麥克風(fēng)也經(jīng)常在電腦里制造,或者我們可以把一個放在電腦的麥克風(fēng)插孔上,通常是粉紅色的,耳機的插孔是綠色的。要在Windows上顯示所有可用的輸入設(shè)備,我們使用dshow設(shè)備的list_devices選項,比如在命令中:
ffmpeg -list_devices 1 -f dshow -i dummy
輸出取決于所使用的計算機,示例輸出說明下一個圖像:

輸出顯示有一個名為“HP webcam”的網(wǎng)絡(luò)攝像頭和一個名為“麥克風(fēng)(Realtek High Defini)”的麥克風(fēng)。麥克風(fēng)的全稱是“麥克風(fēng)(Realtek高清)”,但顯示的只有31個字符。
-
因為上面的命令是針對Windows的,所以我的MAC平臺下面需要下面的命令:
ffmpeg -f avfoundation -list_devices true -i "" 顯示效果如下:

可用選項的攝像頭
Webcam通常有幾種使用-list_options參數(shù)顯示的工作模式。要顯示來自以前輸出的“HP webcam”網(wǎng)絡(luò)攝像頭的選項,我們可以使用以下命令:
ffmpeg -list_options true -f dshow -i video="HP Webcam"
我的測試命令:
ffmpeg -f avfoundation -r 30 -i "1:0" -t 20 /Users/zhangfangtao/Desktop/test2.mp4
- 聲明一下,我的facetime沒登錄,也打不開,所以就錄屏了,錄了二十秒鐘的屏幕
效果圖如下:

輸出取決于攝像機類型,通常顯示可用的分辨率(幀大小)和幀速率:

顯示和記錄網(wǎng)絡(luò)攝像機的輸入
當(dāng)我們知道網(wǎng)絡(luò)攝像頭的名稱時,我們可以在屏幕上顯示它的輸入,或者將它記錄到文件中。下一個命令顯示帶有默認(rèn)設(shè)置的webcam輸入(通常是最大大小和最大幀速率),第一個是ffplay媒體播放器,第二個是SDL輸出設(shè)備:
ffplay -f dshow -i video="HP Webcam"
ffmpeg -f dshow -i video="HP Webcam" -f sdl "webcam via ffmpeg"

我的測試命令:
ffplay -f avfoundation -i "2:0"
-
錄制的副屏的屏幕信息
-
解釋一下,錄制的是我的副屏屏幕信息。如果錄制主屏幕信息,就是另外一個樣子了。。。。:
要將webcam輸入記錄到文件中,我們可以使用以下命令:
ffmpeg -f dshow -i video="HP Webcam" webcam.avi
我的測試命令:
ffmpeg -f avfoundation -r 30 -i "0:0" -t 30 /Users/zhangfangtao/Desktop/test2.mp4
- 結(jié)果就是生成了一個30秒鐘的視頻文件,視頻內(nèi)容就是FaceTime里面的內(nèi)容。
- 這里說明一下,我一開始是想生成一個10MB的視頻文件,結(jié)果都錄了二十多分鐘了,還沒有停下來的意思,我就強制終止了,結(jié)果那時候視頻已經(jīng)將近五十兆了。。。。大小設(shè)置真的很不準(zhǔn)、。。。
Webcams通常有一個默認(rèn)的媒體格式,比如AVI、MOV等,它們將輸入保存在一個與網(wǎng)絡(luò)攝像頭相關(guān)的應(yīng)用程序中。使用這些默認(rèn)的文件格式有時會導(dǎo)致比使用其他文件格式更好的視頻質(zhì)量。
使用兩個攝像頭
如果有兩個網(wǎng)絡(luò)攝像頭可用,我們可以通過USB端口將它們連接到電腦上,同時用ffmpeg工具顯示它們的輸出。下一個命令顯示網(wǎng)絡(luò)攝像頭的名稱,包括麥克風(fēng)名,控制臺輸出如下:
ffmpeg -list_devices 1 -f dshow -i dummy

惠普Webcam的選項和如何顯示它們的命令在Webcam的可用選項部分中,下面是第二個Webcam命名為Sirius USB2.0相機的選項:

顯示輸入網(wǎng)絡(luò)攝像頭我們可以使用覆蓋過濾器和因為默認(rèn)視頻大小的攝像頭是640 x480像素,我們第二個輸入的大小設(shè)置為320 x240(qvga)-video_size選項,該命令(單引號返回錯誤,只能使用雙引號):
ffmpeg -f dshow -i "video=Sirius USB2.0 Camera" -f dshow -video_size qvga ^ -i "video=HP Webcam" -filter_complex overlay -f sdl "2 webcams"
前面的命令將第二個webcam輸入定位到左上角,將其放置到右下角,我們將寬度和高度參數(shù)添加到疊加過濾器中:疊加=W/2:H/2。
錄音并發(fā)送到揚聲器
與網(wǎng)絡(luò)攝像頭類似,麥克風(fēng)也有幾個工作模式,這些工作模式顯示為-list_options參數(shù)設(shè)置為true或1。對于輸入?yún)?shù)使用音頻類型而不是視頻,在前幾節(jié)中使用-list_devices選項列出的麥克風(fēng)的命令是:
ffmpeg -list_options 1 -f dshow -i "audio=Microphone (Realtek High Defini"

要將聲音從麥克風(fēng)傳到揚聲器,我們可以使用以下命令:
ffplay -f dshow -i audio="Microphone (Realtek High Defini"
將聲音記錄到音頻文件的命令如下:
ffmpeg -f dshow -i audio="Microphone (Realtek High Defini" -t 60 mic.mp3
從麥克風(fēng)和網(wǎng)絡(luò)攝像頭錄制音頻和視頻,我們可以使用以下命令:
ffmpeg -f dshow -i audio="Microphone (Realtek High Defini":^ video="HP Webcam" webcam_with_sound.avi

