在React Native中使用WebRTC并加上美顏濾鏡

React Native + WebRTC + GPUImage一套解決方案

簡(jiǎn)介

想給爸媽視頻的時(shí)候加點(diǎn)美顏效果鞠呈,然后再電腦上也能看融师,本人是前端,所以技術(shù)選型如下:

  • react-native-webrtc
  • WebRTC 57版本
  • GPUImage + BeautifyFaceDemo
  • Swift + OC混編

大體步驟如下

  1. 更改WebRTC源碼蚁吝,將攝像頭獲取到的CMSampleBuffer傳遞出去旱爆,然后新增一個(gè)接口接受更改好的CVPixelBuffer。
  2. 將接收到的sample buffer傳遞給GPUImageMovie進(jìn)行處理窘茁,給GPUImageMovie添加任意濾鏡
  3. 使用最新master上的GPUImage怀伦,其給GPUImageFrameBuffer暴露了獲取CVPixelBuffer的接口
  4. 自己寫(xiě)一個(gè)簡(jiǎn)單的GPUImagePixelOutput用上一條說(shuō)的接口輸出加好濾鏡的CVPixelBuffer。
  5. 然后將這個(gè)pixel buffer傳回到WebRTC中山林。
    • 你傳回去的這個(gè)pixel buffer已經(jīng)被GPUImage處理成RGBA顏色的了房待,可是WebRTC只支持解析YUV的視頻,為了讓它能正常展示驼抹,我們需要用H264編碼桑孩,而不是默認(rèn)的VP8,如果在SDP文件中寫(xiě)明了視頻是H264的框冀,視頻傳遞給別的客戶端之前是會(huì)被進(jìn)行編碼的褒纲,這個(gè)時(shí)候就不管你輸入是RGBA還是YUV都能得到正確的處理裸扶。
    • 然而烫沙,這個(gè)時(shí)候WebRTC有兩個(gè)流程漫试,當(dāng)沒(méi)有peer connection的時(shí)候极谊,自己本地的視頻流預(yù)覽并不會(huì)走編碼就直接到renderer了诡右。而上面說(shuō)了WebRTC自己的renderer是不認(rèn)RGBA的。所以只有兩條路走:1. 自己寫(xiě)一個(gè)兼容的renderer轻猖,2. 自己的流就不走WebRTC的renderer了帆吻,反正有更好用的GPUImageView能用。這兩種都實(shí)現(xiàn)過(guò)之后咙边,選擇使用后者猜煮。
  6. 更改react-native-webrtc源碼,讓其支持H264的SDP败许。
  7. 將自己寫(xiě)的GPUImageView暴露給React Native
  8. 用react-native-webrtc完成所有流程

WebRTC更改編譯

54版本

問(wèn)題在于王带,沒(méi)有編譯成.framework的腳本,得自己寫(xiě)市殷。

已經(jīng)鎖定的版本號(hào)有編譯錯(cuò)誤

  • BUILD.gn 增加編譯成framework的代碼
  • sdk.gyp
  • 修復(fù)未使用結(jié)果的警告

57版本

  • BUILD.gn 增加新增文件

添加代理愕撰,將CMSampleBuffer轉(zhuǎn)發(fā)、接收

Header中新建RTCVideoProxy.h文件,Classes中新建RTCVideoProxy.m文件

react-native-webrtc源碼更改

找到AppRTCDemo里的增加h264描述的函數(shù)

其他問(wèn)題

  1. 獲取到的圖被旋轉(zhuǎn)了90度
  2. 關(guān)于性能優(yōu)化

性能優(yōu)化

少開(kāi)動(dòng)畫(huà)少開(kāi)動(dòng)畫(huà)少開(kāi)動(dòng)畫(huà)~8阏酢4佟!
或者所有動(dòng)畫(huà)都用lottie實(shí)現(xiàn)囱桨,盡可能降低js開(kāi)銷

盡量減小javascript開(kāi)銷
消除無(wú)用動(dòng)畫(huà)示例:

// AnimatedComponent

value = new Animated.Value(0)
animate = () => { this._animate() }
_animate = (force: boolean = false) => {
    if (this.props.animated || force) {
        this.value.setValue(0)
        Animated.timing(this.value, {
            toValue: 1,
            duration: 6000,
        }).start(this.animate)
    }
}
componentDidMount() { this.animate() }
componentWillReceiveProps(nextProps: LoadingAvatarProps) {
    if (this.props.animated !== nextProps.animated) {
        if (nextProps.animated) {
            this._animate(nextProps.animated)
        } else {
            this.value.stopAnimation()
        }
    }
}
componentWillUnmount() {
    this.value.stopAnimation()
}

React-native-webrtc深坑不能設(shè)置getusermedia的設(shè)置仓犬。。舍肠。做客戶端webrtc開(kāi)發(fā)還是得用原生的方法搀继。

附錄:WebRTC源碼中比較讓人在意的點(diǎn)

  1. VideoBroadcast中分發(fā)frame給接收者
  2. 旋轉(zhuǎn)

工作比較忙....持續(xù)更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翠语,隨后出現(xiàn)的幾起案子律歼,更是在濱河造成了極大的恐慌,老刑警劉巖啡专,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件险毁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡们童,警方通過(guò)查閱死者的電腦和手機(jī)畔况,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)慧库,“玉大人跷跪,你說(shuō)我怎么就攤上這事∑氚澹” “怎么了吵瞻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)甘磨。 經(jīng)常有香客問(wèn)我橡羞,道長(zhǎng),這世上最難降的妖魔是什么济舆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任卿泽,我火速辦了婚禮,結(jié)果婚禮上滋觉,老公的妹妹穿的比我還像新娘签夭。我一直安慰自己,他們只是感情好椎侠,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布第租。 她就那樣靜靜地躺著,像睡著了一般我纪。 火紅的嫁衣襯著肌膚如雪慎宾。 梳的紋絲不亂的頭發(fā)上儡羔,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音璧诵,去河邊找鬼汰蜘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛之宿,可吹牛的內(nèi)容都是我干的族操。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼比被,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼色难!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起等缀,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枷莉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后尺迂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體笤妙,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年噪裕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹲盘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膳音,死狀恐怖召衔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祭陷,我是刑警寧澤苍凛,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站兵志,受9級(jí)特大地震影響醇蝴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毒姨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一哑蔫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弧呐,春花似錦、人聲如沸嵌纲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逮走。三九已至鸠蚪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茅信。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工盾舌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蘸鲸。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓妖谴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親酌摇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膝舅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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