AVVideoComposition применяет обработчик фильтра не вызывать - PullRequest
0 голосов
/ 26 июня 2018

Я хочу добавить оверлейное изображение в видео.Я использую AVVideoComposition и CIFilter, чтобы сделать это, но обработчик AVAsynchronousCIImageFilteringRequest не вызывается.Я поставил несколько точек останова (строка debugPrint «Здесь», 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 голосов
/ 26 июня 2018

Не следует использовать предварительную настройку сквозной передачи с фильтрацией CI.Попробуйте вместо этого использовать другой пресет, который определяет формат видео.

В этих документах конкретно не упоминается фильтрация CI, но указывается, что использование предустановки сквозного доступа приведет к игнорированию инструкций слоя.Я ожидаю, что это то же самое для фильтрации CI.

Важно: Если вы экспортируете видео композицию с объектом AVAssetExportSession и задаете пресет экспорта AVAssetExportPresetPassthrough, чтобы пропустить все дорожки, преобразование, определенное вИнструкция по созданию видео (AVMutableVideoCompositionLayerInstruction) не будет применена.Вы должны изменить предустановку экспорта на ту, которая определяет формат видео (например, AVAssetExportPresetMediumQuality) для применения преобразования.

0 голосов
/ 26 июня 2018

С некоторой помощью я разобрался, я использовал предустановку AVAssetExportPresetPassthrough, AVAssetExportSession игнорирует фильтр.Я изменил пресет, теперь он работает.

...