美文网首页
iOS直播推流实现-滤镜

iOS直播推流实现-滤镜

作者: Oceanj | 来源:发表于2021-03-30 20:33 被阅读0次

    将最近学习的直播推流技术做个笔记。
    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
    

    相关文章

      网友评论

          本文标题:iOS直播推流实现-滤镜

          本文链接:https://www.haomeiwen.com/subject/jdvvcltx.html