iOS直播推流实现-滤镜
2021-03-30 本文已影响0人
Oceanj
将最近学习的直播推流技术做个笔记。
iOS推流的主要流程如下:
滤镜
美颜本人研究不多,只会使用第三方的美颜sdk,如GPUImage,商汤美颜,当然商汤也能实现贴纸效果,这里主要介绍下如何给帧图片附加一张挂件图片。
在ios 可以使用CoreImage 实现贴纸功能。
一般情况我们采集视频后,AVFoundation给我返回CVPixelBuffer指针。这个对象包含了一帧的数据。
将附加图片输出到CVPixelBuffer,代码如下。
// 创建一个CI上下文
let ciImage: CIImage //... ciImage 是要附加的挂件图片
let context = CIContext()
let pixelBuffer = //.. 此处是从采集获取到的原始帧数据
//锁定PixelBuffer的基址,以确保该内存是可访问的。
CVPixelBufferLockBaseAddress(pixelBuffer, [])
let colorSpace = CGColorSpaceCreateDeviceRGB() // 获取颜色空间
// pixelBuffer转换成CIImage
let inputImage = CIImage(cvImageBuffer: pixelBuffer, options: [CIImageOption.colorSpace: colorSpace])
// 设置图片位置
let trans = CGAffineTransform(translationX: 10, y: 10)
let filterPosition = CIFilter(name: "CIAffineTransform")!
filterPosition.setValue(ciImage, forKey: "inputImage")
filterPosition.setValue(NSValue(CGAffineTransform:trans), forKey: "inputTransform")
// 通过CIFilter 附加图片
let combinedFilter = CIFilter(name: "CISourceOverCompositing")!
combinedFilter.setValue(filterPosition.outputImage, forKey: "inputImage") // 放在前面
combinedFilter.setValue(inputImage, forKey: "inputBackgroundImage") // 原图放在背后
let outputImage = combinedFilter.outputImage! // 合并图片
// 解锁
CVPixelBufferUnlockBaseAddress(pixelBuffer, [])
// 渲染到pixelBuffer
context.render(outputImage, to: pixelBuffer, bounds: outputImage.extent, colorSpace: colorSpace)
return pixelBuffer