如何解决将 CAShapeLayer 合并到 CVPixelBuffer
我正在使用 AVPlayerItemVideoOutput.copyPixelBuffer 捕获正在播放的视频的输出
我能够将像素缓冲区转换为 CIImage,然后再次将其渲染回像素缓冲区,然后 AVAssetWriter 成功地将缓冲区流写入新的影片剪辑。
我转换为 CIImage 的原因是我想对每一帧进行一些操作。 (目前我还不明白如何直接操作像素缓冲区)。
在这种情况下,我想覆盖用户用手指绘制的“涂鸦”风格的绘图。当视频播放时,他们可以在它上面画画。我正在成功地将此绘图捕获到 CAShapeLayer 中。
下面的代码仅成功输出叠加层 CAShapeLayer。当我尝试通过取消注释显示的行来重新合并原始帧时,整个过程急剧下降,并在 iPhone 12 上从 60fps 下降到不稳定的 10fps 左右。我在所有情况下都获得稳定的 60fps,除非我取消注释该代码。
以 60fps 的“实时”速度将形状层合并到这个像素缓冲区流中的最佳方法是什么?
注意:此代码中的一些尚未完成——正确设置边界等。但这与我的问题无关,我知道必须这样做。旋转/平移用于定位形状层——这一切现在都有效。
func addShapesToBuffer(buffer: CVPixelBuffer,shapeLayer: CAShapeLayer) -> CVPixelBuffer? {
let coreImage = CoreImage.CIImage.init(cvImageBuffer: buffer)
let newBuffer = getBuffer(from: coreImage)
CVPixelBufferLockBaseAddress(newBuffer!,[])
let rect = CGRect(origin: CGPoint.zero,size: CGSize(width: 800,height: 390))
shapeLayer.shouldRasterize = true
shapeLayer.rasterizationScale = UIScreen.main.scale
shapeLayer.backgroundColor = UIColor.clear.cgColor
let renderer = UIGraphicsImageRenderer(size: rect.size)
let uiImageDrawing = renderer.image {
context in
// let videoImage = UIImage(ciImage: coreImage)
// videoImage.draw(in: rect)
let cgContext = context.cgContext
cgContext.rotate(by: deg2rad(-90))
cgContext.translateBy(x: -390,y: 0)
return shapeLayer.render(in: cgContext)
}
let ciContext = CIContext()
let newImage = CIImage(cgImage: uiImageDrawing.cgImage!)
ciContext.render(_: newImage,to: newBuffer!)
CVPixelBufferUnlockBaseAddress(newBuffer!,[])
return newBuffer
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。