iOS直播推流实现-滤镜

2021-03-30  本文已影响0人  Oceanj

将最近学习的直播推流技术做个笔记。
iOS推流的主要流程如下:

  1. 视频音频采集
  2. 视频美颜滤镜和贴纸
  3. 视频编码和音频编码
  4. 推流到流服务器

滤镜

美颜本人研究不多,只会使用第三方的美颜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
上一篇下一篇

猜你喜欢

热点阅读