AVAssetExportSession
将预设作为其初始化参数之一:
AVAssetExportSession(asset: AVAsset, presetName: String)
其中预设是设置,如AVAssetExportPreset640x480
或AVAssetExportPreset1920x1080
。但是,如果我想使用自定义分辨率(例如 250x400)进行编码,有没有办法做到这一点,如果有,怎么做?
AVAssetExportSession
将预设作为其初始化参数之一:
AVAssetExportSession(asset: AVAsset, presetName: String)
其中预设是设置,如AVAssetExportPreset640x480
或AVAssetExportPreset1920x1080
。但是,如果我想使用自定义分辨率(例如 250x400)进行编码,有没有办法做到这一点,如果有,怎么做?
这些导出选项已定义,无法让您使用自定义分辨率进行编码。或者,您可以尝试这种方法
func exportVideo(asset:AVAsset, renderedWidth: CGFloat, renderedHeight: CGFloat, exportCompletionHandler: (() -> Void)?) {
let videoTrack: AVAssetTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0]
let videoComposition = AVMutableVideoComposition()
videoComposition.frameDuration = CMTimeMake(1, 30)
videoComposition.renderSize = CGSizeMake(renderedWidth, renderedHeight)
let instruction: AVMutableVideoCompositionInstruction = AVMutableVideoCompositionInstruction.init()
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30))
let transformer: AVMutableVideoCompositionLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: videoTrack);
//Apply any transformer if needed
//
instruction.layerInstructions = [transformer]
videoComposition.instructions = [instruction]
//Create export path
let exportPath: NSURL = NSURL(fileURLWithPath: "export_path_here")
//
let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality)
exporter?.videoComposition = videoComposition
exporter?.outputURL = exportPath
exporter?.outputFileType = AVFileTypeQuickTimeMovie
exporter?.exportAsynchronouslyWithCompletionHandler({ () -> Void in
//Do sth when finished
if let handler = exportCompletionHandler {
handler()
}
})
}
我希望这会有所帮助。
参考:https ://www.one-dreamer.com/cropping-video-square-like-vine-instagram-xcode/
您可以使用自定义分辨率,使用 AVAssetWriter 而不是 AVAssetExportSession 进行调查。This question here有一些相关的示例代码使用AVFoundation录制方形视频并添加水印
另一个相当直接的替代方法是查看使用 SDAVssetExportSession https://github.com/rs/SDAVAssetExportSession,它是 AVAssetExportSession 的“插入”替代品,需要一些额外的设置(在内部它只是包装的 AVAssetReader 和 AVssetWriter 的实现看起来像 AVAssetExportSession 但另外公开了 videoSettings 和 audioSettings 选项)。