首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用过滤器处理程序的AVVideoComposition不调用

应用过滤器处理程序的AVVideoComposition不调用
EN

Stack Overflow用户
提问于 2018-06-26 06:23:51
回答 2查看 1.4K关注 0票数 2

我想在视频中添加一个覆盖图像。我使用AVVideoComposition和CIFilter来完成这个任务,但是AVAsynchronousCIImageFilteringRequest处理程序没有调用。我放置了一些断点(debugPrint“这里”,request.finish行),但是XCode没有命中断点。

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

代码语言:javascript
复制
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")
            }
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-26 07:05:41

您不应该使用传递预置与CI过滤。尝试使用另一个预置来定义视频格式。

这个医生没有特别提到CI过滤,但是它指出使用通通预置会导致层指令被忽略。我认为CI过滤也是一样的。

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

票数 1
EN

Stack Overflow用户

发布于 2018-06-26 07:02:43

在一些帮助下,我发现我使用了预设的AVAssetExportPresetPassthrough,AVAssetExportSession忽略了过滤器。我改变了预设,现在起作用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51036125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档