WebRTC Windows端推1080P/30幀
1 背景
Windows端的瀏覽器(例如Chrome)推1080P/30幀在普通機器上應該是可以的,但是默認的OpenH264軟編CPU佔用較高,據說在某些特定機器的某些編碼參數下可以觸發硬件編碼,可以有效降低CPU佔用。然而這裏專指Native,不是瀏覽器。
2 WebRTC版本
66
3 測試
3.1 測試環境
3.1.1 硬件
設備 | 信息 |
---|---|
CPU | Intel® Core™ i5-7200U CPU @ 2.50GHz,2701 Mhz,2 個內核,4 個邏輯處理器 |
顯卡 | 筆記本集成顯卡,Intel® HD Graphics 620 |
攝像頭 | HD Pro Webcam C920,最大支持1080P |
3.1.2 軟件
Win10,OBS,WebRTC。
3.2 測試內容/數據
推流參數:
- H264 Base Profile;
- 1080P;
- 30FPS;
- 4M碼率。
採集 | 編碼 | CPU | 軟編/硬編 | 備註 |
---|---|---|---|---|
OBS DS D3D | OBS x264 preset:ultrafast | 40% | 軟編 | 使用OBS集成WebRTC測試,顯示的是OBS的CPU,可能包含了圖片預處理的CPU佔用。 |
OBS DS D3D | OBS qsv preset:balance | 24% | 硬編 | 使用OBS集成WebRTC測試,顯示的是OBS的CPU,可能包含了圖片預處理的CPU佔用。 |
WebRTC DS | OBS x264 preset:ultrafast | 49% | 軟編 | |
WebRTC DS | OBS qsv preset:balance | 37% | 硬編 | |
WebRTC DS | WebRTC OpenH264 Base Profile | 58% | 軟編 |
4 一些分析
- WebRTC內部默認使用DirectShow來操作攝像頭,根據要求的參數,輸出了1920*1080的MJPG格式(MJPG格式的最大幀率爲30),是一種壓縮格式,內部又用軟件解碼成YUV,這個環節佔用了大量的CPU,而另外一種輸出格式YUY2,無需解壓,但幀率只支持到5,可能是攝像頭對USB帶寬的考慮;
- OBS的攝像頭採集可以設置分辨率、幀率(不一定成功),但是仍然受攝像頭本身支持的能力限制,比如我使用的這個攝像頭,就無法設置19201080 30FPS的輸出。默認情況下,OBS輸出了640480 30FPS的YUY2圖像,但是貼到1920*1080的畫布上作爲整體最終的輸出。攝像頭輸出圖像跟場景中的其他元素送入D3D進行紋理渲染,最後從紋理生成的圖像轉成NV12,實現了硬件加速,並且沒有解壓過程,CPU佔用很低,同時能夠輸出足夠的幀率;
- 同樣的環境下,x264的性能比OpenH264高。
5 結論
目前看最佳的組合是使用OBS基於硬件加速的採集、編碼,WebRTC自帶的這些模塊性能相比之下遜色不少。
但是,從OBS的輸出原理來看,實際上需要走完採集、渲染的Pipeline,然後再從紋理下載輸出圖像,想把採集模塊摘出來單獨使用並不簡單,只有編碼模塊依賴比較少,比較獨立。