0

我正在以这种方式使用 CIFilters 创建一个 AVVideoComposition:

 videoComposition = AVMutableVideoComposition(asset: asset, applyingCIFiltersWithHandler: {[weak self] request in  

            // Clamp to avoid blurring transparent pixels at the image edges  
            let source = request.sourceImage.clampedToExtent()  
            let output:CIImage  

            if let filteredOutput = self?.runFilters(source, filters: filters)?.cropped(to: request.sourceImage.extent) {  
                output = filteredOutput  
            } else {  
                output = source  
            }  

            // Provide the filter output to the composition  
            request.finish(with: output, context: nil)  
        })  

然后为了正确处理旋转,我创建了一个直通指令,它在直通层上设置身份转换。

     let passThroughInstruction = AVMutableVideoCompositionInstruction()  
     passThroughInstruction.timeRange = CMTimeRangeMake(start: CMTime.zero, duration: asset.duration)  
     let passThroughLayer = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)  
            passThroughLayer.setTransform(CGAffineTransform.identity, at: CMTime.zero)   
     passThroughInstruction.layerInstructions = [passThroughLayer]  
            videoComposition.instructions = [passThroughInstruction]  

问题是它因错误而崩溃:

'*** -[AVCoreImageFilterCustomVideoCompositor startVideoCompositionRequest:] Expecting video composition to contain only AVCoreImageFilterVideoCompositionInstruction'  

我的问题是,如果我不指定此 passThroughInstruction,如果输入资产的视频轨道包含指定旋转 90 度的 preferredTransform,则输出不正确。如何将视频合成与正确处理视频轨道的首选转换的核心图像过滤器一起使用?

编辑:这个问题看起来很相似,但与其他涉及播放的问题不同。就我而言,播放效果很好,但渲染会产生失真的视频。

4

1 回答 1

1

好的,我发现了真正的问题。问题是应用由 AVMutableVideoComposition(asset:, applicationsCIFiltersWithHandler:) 函数返回的 videoComposition 隐式创建一个合成指令,该指令物理旋转 CIImages,以防通过视频轨道上的 preferredTransform 应用旋转变换。是否应该这样做是有争议的,因为preferredTransform 是在玩家级别应用的。作为一种解决方法,除了这个答案中的建议之外。我必须在传递给 AVAssetReader/Writer 的 videoSettings 中调整通过 AVVideoWidthKey、AVVideoHeightKey 传递的宽度和高度。

于 2018-10-13T08:15:55.917 回答