AVVideoComposition应用过滤器处理程序未调用

时间:2018-06-26 06:23:51

标签: ios swift video overlay avvideocomposition

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

我有视频,但没有水印。

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")
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

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

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

  

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

答案 1 :(得分:0)

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