我记录视频(.mp4文件)使用AVAssetWriter与CMSampleBuffer数据(从视频,音频输入)。
当我想要处理帧时,我将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
...
}
...
}发布于 2018-03-02 20:28:06
您需要使用CIContext的render(_:to:bounds:colorSpace:)方法将CIImage呈现为CVPixelBuffer。
然后,您可以使用例如CMSampleBufferCreateReadyWithImageBuffer(_:_:_:_:_:)从CVPixelBuffer创建CMSampleBuffer
出于效率的原因,您可能需要使用CVPixelBuffer池,苹果的AVCamPhotoFilter示例代码中显示了一个这样的示例。具体来说,请参阅RosyCIRenderer class。
另请参阅此答案,它可能对您的Applying a CIFilter to a Video File and Saving it有所帮助
https://stackoverflow.com/questions/49053547
复制相似问题