將最近學習的直播推流技術做個筆記。
iOS推流的主要流程如下:
濾鏡
美顏本人研究不多,只會使用第三方的美顏sdk袜茧,如GPUImage河劝,商湯美顏须肆,當然商湯也能實現(xiàn)貼紙效果榆苞,這里主要介紹下如何給幀圖片附加一張掛件圖片。
在ios 可以使用CoreImage 實現(xiàn)貼紙功能瘟忱。
一般情況我們采集視頻后奥额,AVFoundation給我返回CVPixelBuffer指針。這個對象包含了一幀的數(shù)據(jù)访诱。
將附加圖片輸出到CVPixelBuffer垫挨,代碼如下。
// 創(chuàng)建一個CI上下文
let ciImage: CIImage //... ciImage 是要附加的掛件圖片
let context = CIContext()
let pixelBuffer = //.. 此處是從采集獲取到的原始幀數(shù)據(jù)
//鎖定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