Swift 旋转未按预期工作的视频
我有旋转视频的功能,第一次旋转角度=π/2时,它正常工作,但如果我继续旋转它(π/2),它不工作,它仍然只旋转(π/2),但我希望它旋转π。任何人都可以帮我,谢谢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
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方面的专家,因此我建议您将当前转换存储在类中的一个额外属性中,并使用此属性计算生成的矩阵。