当前位置: 首页 > 面试题库 >

如何使用Swift将过滤器应用于视频实时

江丰羽
2023-03-14
问题内容

是否可以将过滤器应用于 AVLayer* 并将其添加为 addSublayer 以进行 查看
?我想使用Swift改变颜色并为摄像机的视频添加一些噪点,但我不知道该怎么做。
*

我认为,可以像这样添加 filterLayerPreviewLayer

self.view.layer.addSublayer(previewLayer)
self.view.layer.addSublayer(filterLayer)

这可能可以使用我的自定义滤镜创建视频,但是我认为,可以更有效地使用 AVComposition

所以我需要知道:

  1. 将滤镜实时应用于摄像机视频输出的最简单方法是什么?
  2. 可以合并 AVCaptureVideoPreviewLayerCALayer 吗?

谢谢你的每一个建议。


问题答案:

还有另一种选择,使用AVCaptureSession创建CIImage实例,您可以对其应用CIFilter(具有从模糊到颜色校正到VFX的负载)。

这是一个使用ComicBook效果的示例。简而言之,创建一个AVCaptureSession:

let captureSession = AVCaptureSession()
captureSession.sessionPreset = AVCaptureSessionPresetPhoto

创建一个AVCaptureDevice代表相机,在这里设置后置相机:

let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

然后创建设备的具体实现,并将其附加到会话。在Swift 2中,实例化AVCaptureDeviceInput可能会引发错误,因此我们需要捕获以下错误:

 do
{
    let input = try AVCaptureDeviceInput(device: backCamera)

    captureSession.addInput(input)
}
catch
{
    print("can't access camera")
    return
}

现在,这里有个“陷阱”:尽管我们实际上并没有使用AVCaptureVideoPreviewLayer,但是它需要使示例委托正常工作,因此我们创建了其中之一:

// although we don't use this, it's required to get captureOutput invoked
let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

view.layer.addSublayer(previewLayer)

接下来,我们创建一个视频输出AVCaptureVideoDataOutput,我们将使用它来访问视频提要:

let videoOutput = AVCaptureVideoDataOutput()

确保自我实现AVCaptureVideoDataOutputSampleBufferDelegate,我们可以在视频输出上设置样本缓冲区委托:

 videoOutput.setSampleBufferDelegate(self, 
    queue: dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL))

然后将视频输出附加到捕获会话:

 captureSession.addOutput(videoOutput)

…最后,我们开始捕获会话:

captureSession.startRunning()

因为我们已经设置了委托,所以将在每次捕获帧时调用captureOutput。captureOutput传递了一个CMSampleBuffer类型的样本缓冲区,它只需要两行代码即可将该数据转换为CIImage以便Core
Image处理:

let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
let cameraImage = CIImage(CVPixelBuffer: pixelBuffer!)

…,然后将图像数据传递到我们的漫画书效果,该效果又用于填充图像视图:

let comicEffect = CIFilter(name: "CIComicEffect")

comicEffect!.setValue(cameraImage, forKey: kCIInputImageKey)

let filteredImage = UIImage(CIImage: comicEffect!.valueForKey(kCIOutputImageKey) as! CIImage!)

dispatch_async(dispatch_get_main_queue())
{
    self.imageView.image = filteredImage
}

我的GitHub存储库中提供了此项目的源代码。



 类似资料:
  • 也就是说,我想要达到的目标可以从以下的角度来看 如何使用管道实现?

  • 我想把2个视频合成一个视频并排放。我还希望为每个视频设置开始/停止时间。最终视频应为H264/AAC编解码和mp4格式。我附上了样本视频。https://www.dropbox.com/s/e5eouyrrqsy44ts/1.webm?dl=0 https://www.dropbox.com/s/u0zqie0icxamt3q/2.webm?dl=0 我使用了下面的ffmpeg命令。 ffmpeg

  • 我正在尝试创建一个应用程序,可以在其中为录制的视频添加过滤器。基本上,我想复制Instagram视频或Viddy中存在的功能。 我做过研究,但我不能把它全部拼凑起来。我研究过使用GLSurfaceView播放录制的视频,我知道我可以使用NDK进行像素处理,并将其发送回SurfaceView或以某种方式保存。问题是,我不知道如何发送像素数据,因为似乎没有访问它的功能。这个想法来自相机功能“onPre

  • 我需要批量处理一堆视频以将它们的高度缩放到240,保持长宽比不变。几乎完成工作的命令是: 如您所见,有趣的部分是vf比例=-1:240 这适用于缩放输出宽度为偶数的视频。否则,我会收到以下错误消息: 我如何克服这个问题? 编辑:根据这个链接,我尝试使用scale=trunc(oh/a/2)*2:240“输出一部电影,但结果视频质量很差。 编辑#2:这不是重复项,因为它标记错误。这个问题发布得比另一

  • 问题内容: 在ES中是否在查询之前应用了过滤器? 举例来说,我正在做一个非常缓慢的模糊搜索,但是我只是在很小的日期范围内进行。例如,您可以看下面的(PHP): 在尝试进行较慢的搜索之前,是否会应用过滤器? 逻辑将要求先运行筛选器,然后再运行查询,但是我想确定一下。 问题答案: 如果使用-query,则会在对文档计分之前应用过滤器。 通常,这会大大加快速度。但是,模糊查询将仍然使用输入来构建更大的查

  • 问题内容: 我正在尝试开发出租车预订等应用程序并将数据存储在Firebase上。 但是,从Firebase查询RideDetail(History)数据时遇到问题。 我想以分页形式获取ride_detail以获得特定的“ customer_id”。 我的Firebase DataStructure: 这里的“ payment_time”是付款完成后的时间戳。 我想要的响应是: 我希望我在order