我目前正在尝试使用 CoreImage,学习如何将 CIFilters 应用于相机源。目前我已经成功地拍摄了一个相机提要,应用了一个过滤器并将提要以视频的形式写入 AVAssetWriter,但我遇到的一个问题是,在过滤过程中,我实际上裁剪了图像数据使其始终具有方形尺寸(项目的其他方面需要)
我的流程如下:
- 使用 AVCaptureSession 捕获提要
- 从捕获输出中获取 CMSampleBufferRef 并获取 CVPixelBufferRef
- 获取 CVPixelBufferRef 的基地址,并使用基地址作为数据创建一个 CGBitmapContext(这样我们就可以覆盖它)
- 将 CVPixelBufferRef 转换为 CIImage(使用 CIImage 构造函数之一)
- 将过滤器应用于 CIImage
- 将 CIImage 转换为 CGImageRef
- 将 CGImageRef 绘制到 CGBitmapContext (导致样本缓冲区内容被覆盖)
- 将 CMSampleBufferRef 附加到 AVAssetWriterInput。
没有将 CGImageRef 绘制到上下文中,这就是我得到的:
在将 CGImageRef 绘制到上下文之后,这就是我得到的:
理想情况下,我只想能够告诉 CMSampleBufferRef 它有新的维度,以便省略附加信息。但我想知道是否必须完全创建一个新的 CMSampleBufferRef。
任何帮助将不胜感激!