Swift Video Resizer AVAsset

我有这个代码,将video的大小从1280 x 720调整到640 x 360,但是我想要resize而不用裁剪。

有没有办法做一个完整的调整不裁剪?

这是代码

class func resizer(inputURL : NSURL , completion: (outPutURL : NSURL?) -> Void ){ let videoAsset = AVAsset(URL: inputURL) as AVAsset let clipVideoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo).first! as AVAssetTrack let composition = AVMutableComposition() composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID()) let videoComposition = AVMutableVideoComposition() videoComposition.renderSize = CGSizeMake(360,640) videoComposition.frameDuration = CMTimeMake(1, 30) let instruction = AVMutableVideoCompositionInstruction() instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(180, 30)) let transformer : AVMutableVideoCompositionLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack) let t1 = CGAffineTransformMakeTranslation(360, 0) let t2 = CGAffineTransformRotate(t1, CGFloat(M_PI_2)) // let t2 = CGAffineTransformMakeRotation(CGFloat(M_PI_2)) transformer.setTransform(t2, atTime: kCMTimeZero) instruction.layerInstructions = [transformer] videoComposition.instructions = [instruction] let formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'" let date = NSDate() let tempDir = NSTemporaryDirectory().stringByAppendingString(formatter.stringFromDate(date)) let d = "\(tempDir).mp4" let outputURL = NSURL(fileURLWithPath: d) let exporter = AVAssetExportSession(asset: videoAsset, presetName: AVAssetExportPresetHighestQuality) exporter!.videoComposition = videoComposition exporter!.outputURL = outputURL exporter!.outputFileType = AVFileTypeQuickTimeMovie exporter?.exportAsynchronouslyWithCompletionHandler({ () -> Void in dispatch_async(dispatch_get_main_queue(), { completion(outPutURL: outputURL) }) }) } 

我觉得你要找的东西(resize没有收成)是SCALE的video。 尝试使用CGAffineTransformScale / MakeScale。

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGAffineTransform/#//apple_ref/c/func/CGAffineTransformMakeScale

鉴于你有一个0.5(1280/640)的比例,你可以试试这个:

 let t3 = CGAffineTransformScale(t2, 0.5, 0.5) transformer.setTransform(t3, atTime: kCMTimeZero) 

如果看起来不正确,也可能需要按比例调整翻译。

斯威夫特4

 let playerLayer = AVPlayerLayer(player: player) let transform = CGAffineTransform.init(scaleX: 0.5, y: 0.5) playerLayer.setAffineTransform(transform) 

文件