本文分享从WebRTC中使用RTCCameraVideoCapturer采集到的相机数据美颜处理的过程。
思路:在RTCCameraVideoCapturer(视频数据捕捉器)--> RTCVideoSource(视频数据使用者)之间,进行美颜设置。
第一步、截取视频数据
private func createVideoTrack() -> RTCVideoTrack {
let videoSource = WebRTCClient.factory.videoSource()
#if targetEnvironment(simulator)
/// your simulator code
self.videoCapturer = RTCFileVideoCapturer(delegate: videoSource)
#else
/// your real device code
// self.videoCapturer = RTCCameraVideoCapturer(delegate: videoSource)
// 1、将相机获取的数据代理给自己,用于对数据进行美颜设置
self.videoCapturer = RTCCameraVideoCapturer(delegate: self)
#endif
let videoTrack = WebRTCClient.factory.videoTrack(with: videoSource, trackId: "video0")
return videoTrack
}
第二步、响应代理,对相机获取的数据进行美颜处理,处理完之后再返回给数据源videoSource
extension WebRTCClient: RTCVideoCapturerDelegate {
// RTCFileVideoCapturer的代理方法,相机采集的数据都会通过这个方法返回出来,只需要对这个数据进行处理就行
func capturer(_ capturer: RTCVideoCapturer, didCapture frame: RTCVideoFrame) {
// 1、美颜处理,美颜采用的是相芯SDK FURenderKit
guard let buffer: RTCCVPixelBuffer = frame.buffer as? RTCCVPixelBuffer else {
print("error - 1")
return
}
let input: FURenderInput = FURenderInput()
input.pixelBuffer = buffer.pixelBuffer
let output: FURenderOutput = FURenderKit.share().render(with: input)
let nrwbuffer: RTCCVPixelBuffer = RTCCVPixelBuffer.init(pixelBuffer: output.pixelBuffer)
let newframe = RTCVideoFrame(buffer: nrwbuffer, rotation: frame.rotation, timeStampNs: frame.timeStampNs)
// 2、显示画面
// self.renderView?.renderFrame(newframe)
// 3、重新把代理响应给videoSource
self.localVideoTrack?.source.capturer(capturer, didCapture: newframe)
}
}