WebRTC支持H264編解碼

一、引言

眾所周知,Chrome/WebRTC中的視頻編解碼器一直使用Google自己開發(fā)的VP8/VP9,而對于業(yè)界廣泛使用的H264則支持有限。他們這么做除了推廣自家產(chǎn)品外,還有一個很好的理由:專利。VP8/VP9是免專利費(fèi)的,而H264則需要專利授權(quán)。因此,Google Chrome在2011年的時候甚至放棄對H264的支持。

但是,隨著H264的發(fā)展,Chrome不得不再次考慮對H264的支持問題,特別是思科發(fā)布H264開源實(shí)現(xiàn)openh264后。最近,Google宣布從Chrome50開始支持H264視頻編解碼,用戶在打開Chrome時通過如下命令行參數(shù)即可啟用:

? ? ? ? --enable-features=WebRTC-H264WithOpenH264FFmpeg

這無疑是一個好消息,尤其對研究WebRTC的開發(fā)者來說,在WebRTC中啟用H264可以明顯帶來如下收益:

1. 瀏覽器互操作:除Chrome和Firefox外,目前微軟Edge瀏覽器的ORTC也開始支持H264/AVC。

2. 移動設(shè)備支持:移動設(shè)備基本上都支持H264硬件編解碼。

3. 遺留系統(tǒng)互連:遺留視頻系統(tǒng)基本上都使用H264,絕大多數(shù)不支持VP8。使用H264可使得WebRTC和這些系統(tǒng)方便互通。

H264可以極大提高WebRTC瀏覽器互操作

目前看起來形勢一片大好,在WebRTC中啟用H264收益多多。但是,通過研究Chromium/WebRTC源代碼我們發(fā)現(xiàn),目前H264只能夠在Chromium瀏覽器中通過命令行參數(shù)啟用,在WebRTC中則支持有限。具體情況是:默認(rèn)不啟用H264;編碼器使用openh264 Encoder;解碼器使用ffmpeg Decoder;WebRTC代碼中針對H264沒有相應(yīng)的支持和優(yōu)化。

因此,要想在WebRTC中啟用H264,還有很多事情要做。

二、規(guī)劃

根據(jù)上節(jié)對情況的分析,要想在WebRTC中支持H264以獲取其帶來的收益,需要解決以下問題:

? ? ? ? 1. 選定Chrome 50以上版本的codebase為基礎(chǔ)。

? ? ? ? 2. 編譯WebRTC源代碼,得到最新代碼的庫及Demo程序。

? ? ? ? 3. 解除WebRTC源代碼對Chromium的依賴。(可選)

? ? ? ? 4. 替換FFmpeg Decoder為openh264 Decoder。

? ? ? ? 5. 添加WebRTC對H264的適配代碼。

? ? ? ? 6. 測試

本文假定讀者已經(jīng)具有下載WebRTC源代碼并編譯成功的經(jīng)驗(yàn),并且對GYP構(gòu)建系統(tǒng)也有一定的了解,以及如何設(shè)置環(huán)境變量,等等。另外,本文以Windows平臺為例行文,WebRTC基于GYP構(gòu)建系統(tǒng),具有平臺無關(guān)性。

三、實(shí)施

3.1?WebRTC codebase更新到Chrome 52

在WebRTC根目錄下運(yùn)行如下命令[1]:

? ? ? ? gclient sync --with_branch_heads

? ? ? ? git fetch origin

? ? ? ? git checkout –b branch_52 branch-heads/52

? ? ? ? gclient sync

3.2?編譯WebRTC

在Windows平臺上目前需要Visual Studio 2015 Update 2以上的版本,官方推薦使用Professional版,但是Community版也可以。安裝時要選擇定制安裝,選擇Visual C++,通用Windows應(yīng)用開發(fā)工具->工具,通用Windows應(yīng)用開發(fā)工具->Windows 10 SDK(10.0.10586)這三個工具[2]。

另外,需要Windows操作系統(tǒng)為64位系統(tǒng)。且系統(tǒng)語言為英文,否則,編譯時會產(chǎn)生’error C2220:警告被視為錯誤-沒有生成“object”文件’錯誤。

接下來需要設(shè)置環(huán)境變量:

? ? ? ? set GYP_DEFINES=proprietary_codecs=1 build_with_chromium=0

? ? ? ? set GYP_GENERATORS=ninja,msvs

? ? ? ? set GYP_MSVS_VERSION=2015

? ? ? ? gclient runhooks

其中,proprietary_codecs表示要啟用H264 codec。上述執(zhí)行完畢,即在src目錄下生成VS2015工程文件。用VS 2015打開all.sln即可進(jìn)行編譯。

3.3?解除對Chromium的依賴

本步驟對WebRTC支持H264本身沒有關(guān)系。但是考慮到簡化codebase,還是在這里敘述一下。

WebRTC依賴大量第三方庫,這些庫在chromium目錄中,通過符號鏈接指向webrtc本地目錄third_party下。chromium源代碼多達(dá)12GB,而我們只關(guān)心符號鏈接指向的第三方庫,這部分源代碼只有1.6GB。因此,為減小源代碼大小和方便管理,可以通過拷貝符號鏈接目標(biāo)然后刪除chromium目錄??赏ㄟ^腳本一鍵執(zhí)行該任務(wù)。

3.4?適配H264Codec

3.4.1 解除WebRTC對FFmpeg的依賴

如上文所說,Chrome使用FFmpeg的Decoder,因此如果我們想啟用H264 Decoder,需要解除對FFmpeg的依賴。主要修改webrtc/build/common.gypi和webrtc/modules/video_coding/codecs/h264/h264.gypi兩個配置文件,在后者同時添加對openh264 decoder的依賴。

3.4.2 生成openh264 decoder工程

這部分主要修改third_party/openh264/openh264.gyp和openh264.gypi文件,仿照encoder工程文件的生成,添加對decoder工程文件生成的gypi定義。

3.4.3 啟用openh264 codec匯編優(yōu)化

third_party/openh264工程中的gyp文件默認(rèn)不啟用匯編優(yōu)化,這對openh264的性能造成極大影響,為此開啟匯編優(yōu)化。這部分gyp文件編寫較為復(fù)雜,參考了third_party/boringssl庫中g(shù)yp編譯匯編文件的寫法。另外,為編譯匯編代碼,需要安裝2.10.6+版本的nasm匯編器。

3.4.4 為openh264 decoder生成適配類

WebRTC中已經(jīng)實(shí)現(xiàn)H264DecoderImpl類以適配對H264?decoder的調(diào)用,不過這里調(diào)用的是FFmpeg的decoder。為此重新定義H264DecoderImpl類,真正調(diào)用openh264 decoder的API。該部分內(nèi)容參考了文檔[4]。

3.4.5 修改SDP協(xié)商Codec優(yōu)先順序

WebRTC默認(rèn)優(yōu)先使用VP8進(jìn)行編解碼,SDP協(xié)商的時候VP8也是放在最前面。如果要默認(rèn)使用H264,需要修改webrtc/media/engine/webrtcvideoengine2.cc中的DefaultVideoCodecList()函數(shù),把H264部分代碼提到函數(shù)開始處[3]。

至此,代碼修改部分完成。下面即可進(jìn)行編譯測試工作。

4?測試

驗(yàn)證SDP offer和answer中關(guān)于video codec最終協(xié)商為H264。

驗(yàn)證兩個Native Client P2P測試成功,使用H264編解碼。

驗(yàn)證Native Client和Chrome P2P測試成功,使用H264編解碼。

5?總結(jié)

本文根據(jù)Chrome/WebRTC的代碼演化,以實(shí)際工作中的經(jīng)驗(yàn)教訓(xùn)為基礎(chǔ),總結(jié)了在WebRTC中支持H264 Codec的工作流程。通過此次實(shí)踐,我們可以在WebRTC中獲得H264帶給我們的優(yōu)勢,為我們的應(yīng)用提供更好的性能,更大的應(yīng)用場景和更多的可能性。


參考文檔:

1.?https://webrtc.org/native-code/development/

2.?https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md

3.?http://blog.csdn.net/doitsjz/article/details/51787567

4.?http://blog.csdn.net/xyblog/article/details/50433118

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容