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,然後再從紋理下載輸出圖像,想把採集模塊摘出來單獨使用並不簡單,只有編碼模塊依賴比較少,比較獨立。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章