webrtc支持h264軟編解碼

通過webrtc的研究厌蔽,webrtc中默認(rèn)只支持了VP8,VP9兩種軟編解碼方式密末,不過硬編解碼,可以支持h264旷档,但是對(duì)于android或者說windows來說狠轻,是有很多機(jī)型需要適配h264,目前一些播放器大多也是以h264為主(例如flv,mp4等格式)彬犯,所以在android開發(fā)上,如何讓webrtc支持h264呢查吊?


首先我們分析如何在android上系統(tǒng)的支持h264編解碼谐区,h264編解碼分為軟編解碼和硬編解碼,對(duì)于硬編解碼逻卖,是Android系統(tǒng)自帶的MediaCodec.class提供編解碼方法宋列,默認(rèn)支持了vp8,vp9和h264,不過對(duì)于硬編解碼评也,webrtc對(duì)不同機(jī)型設(shè)置了白名單炼杖,也就是默認(rèn)只支持OMX.qcom.?和?OMX.Exynos灭返,這樣在測試的過程中,你會(huì)發(fā)現(xiàn)大多數(shù)機(jī)型都無法使用硬編解碼坤邪,這樣就需要添加OMX.hisi.熙含、OMX.MTK.,添加位置在HardwareVideoEncoderFactory.jav中的boolean isHardwareSupportedIncurrentSdk...()方法中艇纺;


上面修改了硬編解碼的白名單怎静,h264的軟編解碼,編碼器采用了openh264黔衡,解碼器采用了ffmpeg,這兩部分代碼都在src/thirdparty中蚓聘,編譯腳本分為單獨(dú)編譯各個(gè)模塊,和webrtc總的編譯模塊盟劫,webrtc.gni中的rtc_use_h264 = proprietary_codecs && !is_android && !is_ios && !(is_win && !is_clang),默認(rèn)情況下proprietary_codecs為false夜牡,所以需要修改proprtetary_codecs為true,后面的是平臺(tái)相關(guān)的,根據(jù)平臺(tái)侣签,去掉自己平臺(tái)的模塊塘装,修改true的方式可以直接設(shè)置為true,或者在編譯gnargs="proprietary_codecs=true"設(shè)置硝岗,這樣openh264可以啟動(dòng)編譯氢哮,至于ffmpeg,默認(rèn)是啟動(dòng)編譯了型檀,但是對(duì)于h264的解碼代碼部分冗尤,未加入編譯腳本中,所以進(jìn)入到third_party/ffmpeg/ffmpeg_generated.gni配置文件中胀溺,將所有關(guān)于h264的源文件添加編譯裂七,同樣,這里是分平臺(tái)相關(guān)的仓坞,里面已經(jīng)實(shí)現(xiàn)了很多關(guān)于音頻或者其他ffmepg的實(shí)現(xiàn)背零,添加內(nèi)容太多,我舉一個(gè)例子if ((is_mac && ffmpeg_branding == "Chrome")|| (is_android) || (is_win && ffmpeg_branding == "Chrome") || (use_linux_config && ffmpeg_branding == "Chrome") || (use_linux_config && ffmpeg_branding == "ChromeOS")) {

??ffmpeg_c_sources += [

????"libavcodec/cabac.c",

????"libavcodec/h2645_parse.c",

????"libavcodec/h264_cabac.c",

????"libavcodec/h264_cavlc.c",

????"libavcodec/h264_direct.c",

????"libavcodec/h264_loopfilter.c",

????"libavcodec/h264_mb.c",

????"libavcodec/h264_parse.c",

????"libavcodec/h264_parser.c",

????"libavcodec/h264_picture.c",

????"libavcodec/h264_ps.c",

????"libavcodec/h264_refs.c",

????"libavcodec/h264_sei.c",

????"libavcodec/h264_slice.c",

????"libavcodec/h264chroma.c",

????"libavcodec/h264data.c",

????"libavcodec/h264dec.c",

????"libavcodec/h264dsp.c",

????"libavcodec/h264idct.c",

????"libavcodec/h264qpel.c",

????"libavcodec/startcode.c",

??]

}

這就是一個(gè)關(guān)于h264的解析的源文件无埃,以前只有is_win和is_mac的判斷徙瓶,需要加入is_android也編譯源代碼,這就是為什么pc添加h264只需要添加一個(gè)編譯屬性即可嫉称,因?yàn)閮?nèi)部默認(rèn)實(shí)現(xiàn)了h264的編譯侦镇,同理,加上所有的h264的編譯源文件织阅,后面在測試中發(fā)現(xiàn)壳繁,新的版本av_register_all在注冊(cè)解碼器的時(shí)候發(fā)生error,這是舊版本沒有的,后面發(fā)現(xiàn)闹炉,新版本采用的ffmpeg是4.2,去掉了此方法蒿赢,改為靜態(tài)編譯,所以需要添加third_party/ffmpeg/chromium/config/Chromium/android/{ABI}/libavcodec/parser_list.c?和?third_party/ffmpeg/chromium/config/Chromium/android/{ABI}/libavcodec/codec_list.c?分別添加 h264 的 parser 和 decoder渣触,至此羡棵,h264的編解碼器都已經(jīng)集成到webrtc的編譯中


在pc中默認(rèn)是提供了h264的調(diào)用接口,那么android中沒有向jni和java層實(shí)現(xiàn)昵观,所以晾腔,下一步,實(shí)現(xiàn)底層的h264接口:

1.參照sdk/android/src/java/org/webrtc/VP8Decoder.java或者VP9Decoder.java啊犬,編寫出H264Decoder.java,這個(gè)是java調(diào)用jni的接口

2.參照sdk/android/jni/vp8codec.cc還活著vp9codec.cc實(shí)現(xiàn)h264codec.cc灼擂,編寫出jni調(diào)用底層c++的接口

3.在src/sdk/android/BUILD.gn中,將添加的h264文件添加到編譯腳本中


以上修改就完成了webrtc支持h264的軟編解碼全部流程:


Webrtc自帶提供的編譯后的結(jié)果是一個(gè)aar文件觉至,aar中包括了.so和jar等其他資源文件剔应,我通過jar的分析,在webrtc源碼中找到所有編譯的java源文件语御,然后移植到android studio進(jìn)行開發(fā)峻贮,這樣方便調(diào)試,至于底層c++代碼应闯,可以通過pc修改后移植進(jìn)去

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纤控,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子碉纺,更是在濱河造成了極大的恐慌船万,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骨田,死亡現(xiàn)場離奇詭異耿导,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)态贤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門舱呻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悠汽,你說我怎么就攤上這事箱吕。” “怎么了柿冲?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵殖氏,是天一觀的道長。 經(jīng)常有香客問我姻采,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任慨亲,我火速辦了婚禮婚瓜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刑棵。我一直安慰自己巴刻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布蛉签。 她就那樣靜靜地躺著胡陪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碍舍。 梳的紋絲不亂的頭發(fā)上柠座,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音片橡,去河邊找鬼妈经。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捧书,可吹牛的內(nèi)容都是我干的吹泡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼经瓷,長吁一口氣:“原來是場噩夢啊……” “哼爆哑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舆吮,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤揭朝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后歪泳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萝勤,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年呐伞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敌卓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伶氢,死狀恐怖趟径,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情癣防,我是刑警寧澤蜗巧,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蕾盯,受9級(jí)特大地震影響幕屹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一望拖、第九天 我趴在偏房一處隱蔽的房頂上張望渺尘。 院中可真熱鬧,春花似錦说敏、人聲如沸鸥跟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽医咨。三九已至,卻和暖如春架诞,著一層夾襖步出監(jiān)牢的瞬間拟淮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工侈贷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惩歉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓俏蛮,卻偏偏與公主長得像撑蚌,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搏屑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一争涌、引言 眾所周知,Chrome/WebRTC中的視頻編解碼器一直使用Google自己開發(fā)的VP8/VP9辣恋,而對(duì)于...
    weizhenwei閱讀 29,982評(píng)論 9 26
  • 最近升級(jí)webrtc(m72版本)亮垫,發(fā)現(xiàn)webrtc源碼發(fā)生了不小的變動(dòng),尤其是在視頻編解碼這塊伟骨,之前的Media...
    還我漂漂拳噠噠噠閱讀 2,725評(píng)論 1 2
  • 前言 ffmpeg實(shí)現(xiàn)了軟件解碼饮潦,以及導(dǎo)入libx264等外部庫實(shí)現(xiàn)軟編碼。同時(shí)它還對(duì)各個(gè)平臺(tái)的硬編解碼也進(jìn)行了封...
    仙人掌__閱讀 12,069評(píng)論 4 18
  • webrtc本身自帶VP8,VP9的編解碼器携狭, google主推VP8,VP9,隨著webrtc發(fā)展继蜡,webrtc...
    阿呆_e66a閱讀 2,746評(píng)論 0 0
  • 公司項(xiàng)目原因,接觸了一下視頻流H264的編解碼知識(shí)逛腿,之前項(xiàng)目使用的是FFMpeg多媒體庫稀并,利用CPU做視頻的編碼和...
    sillen閱讀 782評(píng)論 0 6