【问题标题】:Setting AVMutableVideoComposition instruction causes handler not to be called设置 AVMutableVideoComposition 指令导致处理程序不被调用
【发布时间】:2017-12-18 19:37:21
【问题描述】:

我有一个过滤 AVPlayerItem 资产的功能。问题之一是设置视频的转换。但是,每当我设置AVMutableVideoCompositionAVMutableVideoCompositionInstruction 时,不再调用处理程序。

这是我的代码:

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
}

为什么不再调用handler,我该如何解决?

如果你能回答,我会给你很多布朗尼积分!

【问题讨论】:

    标签: ios swift image-processing avfoundation swift4


    【解决方案1】:

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

    工程部门提供了有关此问题的以下信息:

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

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

    【讨论】:

    • 在处理程序内部,您可以访问每个帧。您可以将转换应用于框架。但是,当我们有并行视频轨道时,这将不起作用。使用 AVMutableVideoComposition 的 customVideoCompositorClass 来实现过滤器是最好的方法。
    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多