Когда я экспортирую видео, тогда CIFilter не работает (AVMutableVideoComposition)
Я использую AVMutableVideoComposition (также пробовал с AVVideoComposition) для применения фильтра к видео и его работы нормально с AVPlayer, но когда я экспортирую видеофильтр не работает. Пожалуйста, объясните мне, что я делаю не так... Спасибо!
let item = AVPlayerItem(asset: currentAsset!)
let videoComposition = AVMutableVideoComposition(asset: currentAsset!) { request in
let filter = CIFilter(name: "CIColorInvert")!
let source = request.sourceImage.clampedToExtent()
filter.setValue(source, forKey: kCIInputImageKey)
// Vary filter parameters based on video timing
//let seconds = CMTimeGetSeconds(request.compositionTime)
//filter.setValue(seconds * 10.0, forKey: kCIInputRadiusKey)
let output = filter.outputImage!.cropped(to: request.sourceImage.extent)
// Provide the filter output to the composition
request.finish(with: output, context: nil)
}
item.videoComposition = videoComposition
self.player.replaceCurrentItem(with: item)
let exporter = AVAssetExportSession(asset: item.asset, presetName: AVAssetExportPresetHighestQuality)
exporter?.videoComposition = videoComposition
exporter?.outputFileType = .mp4
let filename = "filename.mp4"
let documentsDirectory = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask).last!
let outputURL = documentsDirectory.appendingPathComponent(filename)
exporter?.outputURL = outputURL
exporter?.exportAsynchronously(completionHandler: {
guard exporter?.status == .completed else {
print("export failed: \(exporter?.error)")
return
}
print("done: ",outputURL)
//self.player.replaceCurrentItem(with: AVPlayerItem.init(asset: (exporter?.asset)!))
}
)
0 ответов
Здравствуйте, попробуйте применить фильтр к видеофайлу
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let savedoutputURL = documentsDirectory.appendingPathComponent("Filterd.mov")
try? FileManager.default.removeItem(at: savedoutputURL)
let urlVideofile = Bundle.main.url(forResource: "(your video file name)", withExtension: "mov")
let videoAsset = AVAsset(url: urlVideofile!)
let filter = CIFilter(name: "CIColorInvert")!
let composition = AVVideoComposition(asset: asset, applyingCIFiltersWithHandler: { request in
let source = request.sourceImage.clampingToExtent()
filter.setValue(source, forKey: kCIInputImageKey)
// Crop the invert output to the bounds of the original image
let output = filter.outputImage!.cropping(to: request.sourceImage.extent)
// Provide the filter output to the composition
request.finish(with: output, context: nil)
})
// Simultaneous Video playing although you can use as your's
let playerItem = AVPlayerItem(asset: videoAsset)
playerItem.videoComposition = composition
self.player = AVPlayer(playerItem: playerItem)
self.player.volume = 0.0
self.playerController.player = self.player
present(self.playerController, animated: true, completion: {
self.player.play()
})
Сохранение видео
let export = AVAssetExportSession(asset: videoAsset, presetName: AVAssetExportPresetHighestQuality)
export!.outputFileType = AVFileType.mov
export!.outputURL = savedoutputURL
export!.videoComposition = composition
export?.exportAsynchronously(completionHandler: {
if export!.status.rawValue == 4 {
print("Export failed -> Reason: \(export?.error!.localizedDescription))")
print(export?.error!)
return
}
print("done: ",savedoutputURL)
})
Это 100% протестированный код, применяющий фильтр к 26-секундному видео примерно за 10-15 секунд
:)наслаждаться