天天看點

IOS技術分享| 在iOS WebRTC 中添加美顔濾鏡

在使用WebRTC的時候,對視訊進行美顔處理一般有兩種方式:替換WebRTC中的采集子產品和對視訊資料進行美顔。

替換WebRTC中的采集子產品,相對比較簡單,使用GPUImageVideoCamera替換WebRTC中的視訊采集,得到經過GPUImage添加美顔處理後的圖像,發送給WebRTC的OnFrame方法。

參考基于WebRTC架構開發的全平台推拉流SDK:Github

GPUImage處理後的Pixel格式為BGRA,當處理完成後需要轉換為I420格式,用于内部處理和渲染。

WebRTC 在編碼的時候使用的是NV12格式的Pixel,是以在編碼的時候會進行二次格式轉換

GPUImageVideoCapturer 類為GPUImage 封裝的攝像頭類,跟WebRTC中的采集類功能保持一緻,繼承 cricket::VideoCapturer 類,便可以往WebRTC中塞入采集的音視訊流。

對視訊資料美顔的思路就是傳統的第三方美顔SDK的做法,對内部采集的音視訊資料進行處理:内部采集的資料(CVPixelBufferRef)-》轉換為紋理(GLuint)-》對紋理進行音視訊的美顔-》美顔的紋理轉換為iOS的采集資料(CVPixelBufferRef)-》傳回給WebRTC内部進行渲染編碼和傳輸。

内部處理的一般都是使用同步線程,這樣能夠保證資料線性流動,參閱GPUImage中的代碼片段

<code>CoreVideo</code>架構的方法:使用此方法可以建立<code>CVOpenGLESTextureRef</code>紋理,并通過<code>CVOpenGLESTextureGetName(texture)</code>擷取紋理id。

<code>OpenGL</code>的方法:建立紋理對象,使用<code>glTexImage2D</code>方法上傳<code>CVPixelBufferRef</code>中圖像資料data到紋理對象中。

得到textureOutput,即得到輸出的紋理。

把美顔後的CVPixelBufferRef同步傳回給SDK,進行渲染傳輸。

對音視訊的美顔,已經成為了音視訊應用的常用功能,除了上述兩種做法外,還可以使用第三方美顔,一般音視訊廠商都有提供自采集功能,而第三方美顔功能則提供有采集美顔相機功能,二者正好可以無縫結合。如果自身的應用中對美顔要求不是很高,采用音視訊SDK自帶的美顔即可(美白、美顔、紅潤),如果用在娛樂場景,除了美顔,還要美型(廋臉,大眼)、貼紙(2D、3D)的,必須要內建第三方美顔SDK了。

繼續閱讀