本文分享從WebRTC中使用RTCCameraVideoCapturer采集到的相機(jī)數(shù)據(jù)美顏處理的過(guò)程。
思路:在RTCCameraVideoCapturer(視頻數(shù)據(jù)捕捉器)--> RTCVideoSource(視頻數(shù)據(jù)使用者)之間,進(jìn)行美顏設(shè)置。
第一步、截取視頻數(shù)據(jù)
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、將相機(jī)獲取的數(shù)據(jù)代理給自己,用于對(duì)數(shù)據(jù)進(jìn)行美顏設(shè)置
self.videoCapturer = RTCCameraVideoCapturer(delegate: self)
#endif
let videoTrack = WebRTCClient.factory.videoTrack(with: videoSource, trackId: "video0")
return videoTrack
}
第二步、響應(yīng)代理,對(duì)相機(jī)獲取的數(shù)據(jù)進(jìn)行美顏處理,處理完之后再返回給數(shù)據(jù)源videoSource
extension WebRTCClient: RTCVideoCapturerDelegate {
// RTCFileVideoCapturer的代理方法,相機(jī)采集的數(shù)據(jù)都會(huì)通過(guò)這個(gè)方法返回出來(lái),只需要對(duì)這個(gè)數(shù)據(jù)進(jìn)行處理就行
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、顯示畫(huà)面
// self.renderView?.renderFrame(newframe)
// 3、重新把代理響應(yīng)給videoSource
self.localVideoTrack?.source.capturer(capturer, didCapture: newframe)
}
}