iOS:在附加到 AVAssetWriterInput 之前裁剪 CMSampleBufferRef

发布于 2024-12-12 06:26:35 字数 889 浏览 0 评论 0原文

我目前正在尝试 CoreImage,学习如何将 CIFilters 应用于相机源。目前,我成功地获取相机源,应用过滤器并将源以视频的形式写入 AVAssetWriter,但我遇到的一个问题是,在过滤过程中,我实际上裁剪了图像数据以便它始终具有正方形尺寸(项目的其他方面需要)

我的过程如下:

  1. 使用 AVCaptureSession 捕获 feed
  2. 从捕获输出中获取 CMSampleBufferRef 并获取 CVPixelBufferRef
  3. 获取CVPixelBufferRef,并使用基地址作为其数据创建 CGBitmapContext(以便我们可以覆盖它)
  4. 将 CVPixelBufferRef 转换为 CIImage(使用 CIImage 构造函数之一)
  5. 将滤镜应用于 CIImage
  6. 将 CIImage 转换为 CGImageRef
  7. 将 CGImageRef 绘制到 CGBitmapContext (导致示例缓冲区内容被覆盖)
  8. 将 CMSampleBufferRef 附加到 AVAssetWriterInput。

如果不将 CGImageRef 绘制到上下文,这就是我得到的:

在此处输入图像描述

将 CGImageRef 绘制到上下文后,这就是我得到的:

在此处输入图像描述

理想情况下,我只想能够告诉 CMSampleBufferRef 它有新尺寸,以便省略附加信息。但我想知道是否必须完全创建一个新的 CMSampleBufferRef。

任何帮助将不胜感激!

I'm currently experimenting with CoreImage, learning how to apply CIFilters to a camera feed. Presently I'm succeeded in taking a camera feed, applying a filter and writing the feed to an AVAssetWriter in the form of a video, but one issue I'm having with it is that during the filtering process, I actually crop the image data so that it always has square dimensions (needed for other aspects of the project)

My process is as follows:

  1. Capture feed using AVCaptureSession
  2. Take the CMSampleBufferRef from the capture output and acquire the CVPixelBufferRef
  3. Get the Base Address of the CVPixelBufferRef, and create a CGBitmapContext using the base address as its data (so we can overwrite it)
  4. Convert the CVPixelBufferRef to CIImage (using one of the CIImage constructors)
  5. Apply the filters to the CIImage
  6. Convert the CIImage to CGImageRef
  7. Draw the CGImageRef to the CGBitmapContext (resulting in the sample buffers content to be overwritten)
  8. Append the CMSampleBufferRef to the AVAssetWriterInput.

Without drawing the CGImageRef to the context, this is what I get:

enter image description here

After drawing the CGImageRef to the context, this is what I get:

enter image description here

Ideally, I just want to be able to tell the CMSampleBufferRef that it has new dimensions, so that the additional information is omitted. But I'm wondering if I'll have to create a new CMSampleBufferRef altogether.

Any help would be greatly appreciated!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文