【问题标题】:AVVideoComposition applying filter handler not callAVVideoComposition 应用过滤器处理程序不调用
【发布时间】:2018-06-26 06:23:51
【问题描述】:

我想在视频中添加叠加图像。我使用 AVVideoComposition 和 CIFilter 来执行此操作,但未调用 AVAsynchronousCIImageFilteringRequest 处理程序。 我放了一些断点(行 debugPrint“Here”,request.finish),但 XCode 没有达到断点。

我收到了视频,但没有水印。

func watermark(video asset: AVAsset, with image: UIImage, output outURL: URL) {
        guard let watermarkImage = CIImage(image: image) else {
            return
        }

        let context = CIContext(options: nil)

        let videoComposition = AVVideoComposition(asset: asset) { (request) in
            debugPrint("Here")
            let source = request.sourceImage.clampedToExtent()

            let watermarkFilter = CIFilter(name: "CISourceOverCompositing")

            watermarkFilter?.setValue(source, forKey: kCIInputBackgroundImageKey)

            let transform = CGAffineTransform(translationX: request.sourceImage.extent.width - watermarkImage.extent.width - 10, y: 10)
            watermarkFilter?.setValue(watermarkImage.transformed(by: transform), forKey: kCIInputImageKey)
            guard let outputImage = watermarkFilter?.outputImage else {
                return
            }

            request.finish(with: outputImage, context: context)
        }

        let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetPassthrough)
        exporter?.outputFileType = .mov
        exporter?.outputURL = outURL
        exporter?.videoComposition = videoComposition
        exporter?.exportAsynchronously { [weak exporter] in
            guard let export = exporter else {
                return
            }

            switch export.status {
            case  .failed:
                print("failed \(exporter?.error)")
                break
            case .cancelled:
                print("cancelled \(exporter?.error)")
                break
            case .completed:
                print("complete")
            default:
                print("default")
            }
        }
    }

【问题讨论】:

  • 没有人知道你在哪里设置断点。什么不完全有效?
  • 我的错。我编辑了第一篇文章。我收到了视频,但没有水印。
  • 我看不出您是如何将图像与视频相关联的。用它添加一个 CALayer 对象到视频合成中。

标签: ios swift video overlay avvideocomposition


【解决方案1】:

您不应将直通预设与 CI 过滤一起使用。尝试改用另一个定义视频格式的预设。

This docs 没有特别提到 CI 过滤,但它指出使用直通预设会导致层指令被忽略。我希望 CI 过滤也是如此。

重要提示:如果您使用 AVAssetExportSession 对象导出视频合成并指定 AVAssetExportPresetPassthrough 导出预设以让所有轨道通过,则视频合成指令 (AVMutableVideoCompositionLayerInstruction) 中定义的变换将不会应用。您必须将导出预设更改为定义视频格式(例如 AVAssetExportPresetMediumQuality)的预设,才能应用转换。

【讨论】:

  • 感谢您的帮助。我更改了预设,现在它可以工作了。
  • 嘿Thanh,我已经发布了关于这个主题的问题。你有没有机会看看,也许可以帮助我和我的团队?我们被一个小问题困扰了好几天啊:stackoverflow.com/questions/51114201/…
【解决方案2】:

在一些帮助下,我发现,我使用了预设的 AVAssetExportPresetPassthrough,而 AVAssetExportSession 忽略了过滤器。我更改了预设,现在可以了。

【讨论】:

    猜你喜欢
    • 2018-09-09
    • 2013-08-15
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多