Swift 旋转未按预期工作的视频

Swift 旋转未按预期工作的视频,swift,rotation,Swift,Rotation,我有旋转视频的功能,第一次旋转角度=π/2时,它正常工作,但如果我继续旋转它(π/2),它不工作,它仍然只旋转(π/2),但我希望它旋转π。任何人都可以帮我,谢谢 let rotateTransform = CGAffineTransform(rotationAngle: CGFloat((self.rotateAngle * Double.pi)/180)) let videoAsset = AVURLAsset(url: sourceURL) let mixC

我有旋转视频的功能,第一次旋转角度=π/2时,它正常工作,但如果我继续旋转它(π/2),它不工作,它仍然只旋转(π/2),但我希望它旋转π。任何人都可以帮我,谢谢

let rotateTransform = CGAffineTransform(rotationAngle: CGFloat((self.rotateAngle * Double.pi)/180))
        let videoAsset = AVURLAsset(url: sourceURL)
        let mixComposition = AVMutableComposition()
        let compositionVideoTrack = mixComposition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid)
        var clipVideoTrack = videoAsset.tracks(withMediaType: .video)

        try? compositionVideoTrack?.insertTimeRange(CMTimeRange(start: .zero, duration: videoAsset.duration), of: clipVideoTrack[0], at: .zero)
        compositionVideoTrack?.preferredTransform = videoAsset.preferredTransform
        let videoTrack = videoAsset.tracks(withMediaType: .video)[0]
        let videoSize = videoTrack.naturalSize
        let videoComposition = AVMutableVideoComposition()
        videoComposition.renderSize = videoSize
        let timeScale = CMTimeScale(videoTrack.nominalFrameRate)
        videoComposition.frameDuration = CMTime(value: 1, timescale: timeScale)
        let instruction = AVMutableVideoCompositionInstruction()
        instruction.timeRange = CMTimeRangeMake(start: .zero, duration: mixComposition.duration)
        let mixVideoTrack = mixComposition.tracks(withMediaType: .video)[0]
        mixVideoTrack.preferredTransform = rotateTransform
        let layerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: mixVideoTrack)
        layerInstruction.setTransform(mixVideoTrack.preferredTransform, at: .zero)
        instruction.layerInstructions = [layerInstruction]
        videoComposition.instructions = [instruction]

        guard let exportSession = AVAssetExportSession(asset: mixComposition,
                                                       presetName: AVAssetExportPresetPassthrough) else {
            return
        }
        exportSession.outputURL = outputURL
        exportSession.outputFileType = .mov
        exportSession.videoComposition = videoComposition
        exportSession.exportAsynchronously { [weak self] in
            self?.handleExportSession(exportSession: exportSession, sourceURL: sourceURL, outputURL: outputURL)
        }
    }

如果设置变换,则该变换将始终应用于原始方向。因此,当您按pi/2设置旋转矩阵时,原始矩阵将按pi/2旋转。如果再次应用相同的旋转矩阵,原始矩阵将再次旋转pi/2。您需要的是将当前变换与新旋转相结合,然后设置生成的变换

比如:

let currentTransform = mixVideoTrack.preferredTransform // or whereever you get it from
let newTransform = currentTransform.rotated(by: CGFloat((self.rotateAngle * Double.pi)/180))
mixVideoTrack.preferredTransform = newTransform

谢谢你的回答,但当我调试时,我发现在我旋转后currentTransform没有改变,它总是得到:▿ CGAffineTransform-a:1.0-b:0.0-c:0.0-d:1.0-tx:0.0-ty:0.0我不是AV方面的专家,因此我建议您将当前转换存储在类中的一个额外属性中,并使用此属性计算生成的矩阵。