ios - CIImage 回到 CMSampleBuffer

标签 ios swift core-image video-recording

我使用 AVAssetWriterCMSampleBuffer 数据(来自视频、音频输入)录制视频(.mp4 文件)。

在录制时我想处理帧,我正在将 CMSampleBuffer 转换为 CIImage 并对其进行处理。

但是如何使用来自 CIImage 的新处理图像缓冲区更新 CMSampleBuffer

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    if output == videoOutput {
       let imageBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
       let ciimage: CIImage = CIImage(cvPixelBuffer: imageBuffer)
       ... // my code to process CIImage (for example add augmented reality)
       // but how to convert it back to CMSampleBuffer?
       // because AVAssetWriterInput to encode video/audio in file needs CMSampleBuffer
       ...
    } 
    ...
}

最佳答案

您需要使用 CIContext 的 render(_:to:bounds:colorSpace:) 将 CIImage 渲染到 CVPixelBuffer 中方法。

然后您可以使用例如 CVPixelBuffer 创建一个 CMSampleBuffer CMSampleBufferCreateReadyWithImageBuffer(_:_:_:_:_:)

出于效率原因,您可能需要使用 CVPixelBuffer 池,Apple 的 AVCamPhotoFilter 示例代码中显示了一个示例。特别是,请参阅 RosyCIRenderer class .

另请参阅可能对您有帮助的答案Applying a CIFilter to a Video File and Saving it

关于ios - CIImage 回到 CMSampleBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49053547/

相关文章:

ios - CIFilter filterWithCVPixelBuffer 在 iOS 中返回 nil

sprite-kit - 如何将 CIPixellate 核心图像过滤器添加到 Sprite Kit 场景中?

ios - 从 Xcode 5 支持旧版本的 iOS

ios - 为什么 Swift 闭包变量类型不能隐式解包可选值?

ios - Return Observer.create 不返回并且旁边的代码不能使用 RxSwift 工作

ios - 快速向按钮添加手势

swift - 使用 Core Image 缩放图像是裁剪而不是缩放

ios - Xcode 用户为 JSON 服务定制 NSURL

ios - 带有文本/纯文本响应的 API 失败,返回 'unacceptable content-type'

ios - iPad Safari Web Inspector 在页面加载时崩溃