我尝试为视频的每个帧添加一个过滤器,由AVAsset
表示。但是,当我使用AVMutableVideoComposition
添加过滤器时,视频的方向会发生变化。例如,视频是以人像拍摄的,应用滤镜后,新视频变为风景。我尝试从两个不同的轨道打印出preferredTransform
,一个在应用滤镜后保持其方向,一个旋转。正确轨道的preferredTransform
将打印出CGAffineTransform(a: 1.0, b: 0.0, c: 0.0, d: 1.0, tx: 0.0, ty: 0.0)
的单位矩阵,旋转的单位矩阵将打印出CGAffineTransform(a: 0.0, b: 1.0, c: -1.0, d: 0.0, tx: 1080.0, ty: 0.0)
之类的内容。我的直觉告诉我,我可能能够重置错误轨道的preferredTransform。我试图使用AVMutableVideoCompsitionLayerInstruction,但它不起作用,视频停止播放没有应用过滤器。我是这样做的:
func addFilter(){
if let asset = self.asset{
let filterString = "CIPhotoEffectInstant"
let composition = AVMutableVideoComposition(asset: asset, applyingCIFiltersWithHandler: { request in
let filtered = request.sourceImage.applyingFilter(filterString, withInputParameters: nil)
request.finish(with: filtered, context: nil)
})
guard let videoTrack = asset.tracks(withMediaType: AVMediaTypeVideo).first else {
return
}
print(CGAffineTransform.identity)
//AVMutableVideoCompositionLayerInstruction
let compositionLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack)
compositionLayerInstruction.setTransform(.identity, at: asset.duration)
//AVMutableVideoCompositionInstruction
let compositionInstruction = AVMutableVideoCompositionInstruction()
compositionInstruction.layerInstructions = [compositionLayerInstruction]
composition.instructions = [compositionInstruction]
print(videoTrack.preferredTransform)
self.playerItem?.videoComposition = composition
self.currentVideoComposition = composition
}
}