设置AVMutableVideoComposition指令会导致不调用处理程序

时间:2017-07-13 20:37:05

标签: ios swift image-processing avfoundation swift4

我有一个过滤AVPlayerItem资产的功能。其中一个问题是设置视频的转换。但是,每当我设置AVMutableVideoCompositionInstruction的{​​{1}}时,都不再调用处理程序。

这是我的代码:

AVMutableVideoComposition

为什么不再调用private func filter(playerItem: AVPlayerItem) { let videoComposition = AVMutableVideoComposition(asset: playerItem.asset, applyingCIFiltersWithHandler: { (request) in print("Composing") // does not print whenever the instructions are added if let filteredImage = filterImage(request.sourceImage) { request.finish(with: filteredImage, context: nil) } else { request.finish(with: RenderError.couldNotFilter) // An error } }) guard let videoTrack = playerItem.asset.tracks(withMediaType: .video).first else { return } let size = CGSize(width: videoTrack.naturalSize.height, height: videoTrack.naturalSize.width) videoComposition.renderSize = size let videoInstruction = AVMutableVideoCompositionInstruction() videoInstruction.timeRange = CMTimeRange(start: kCMTimeZero, duration: playerItem.asset.duration) let transformInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack) let translate = CGAffineTransform(translationX: size.width, y: size.height) let rotate = CGAffineTransform(rotationAngle: CGFloat.pi) transformInstruction.setTransform(translate.concatenating(rotate), at: kCMTimeZero) videoInstruction.layerInstructions.append(transformInstruction) videoComposition.instructions.append(videoInstruction) playerItem.videoComposition = videoComposition } ,我该如何解决?

如果你能回答,我会给你这么多的布朗尼点!

1 个答案:

答案 0 :(得分:3)

我向Apple提交了一份错误报告,显然这种行为不是错误。这是他们的回应:

  

Engineering提供了有关此问题的以下信息:

     

CoreImage过滤和基于图层指令的合成不能同时使用。添加到AVMutableVideoComposition时,不会运行图层指令,使用+ [videoCompositionWithAsset:applyingCIFiltersWithHandler:]初始化它。要在这种情况下使用图层指令,请将功能移动到处理程序中,而不是将图层指令添加到AVMutableVideoComposition。

这解释了为什么指令似乎没有做任何事情,并且没有调用处理程序。他们说将转换功能移到处理程序而不是使用指令;不幸的是,我不太清楚如何实施这个解决方案 - 这是另一个问题。