因此,目前我正在使用它来压缩视频:
func compressVideo(inputURL: NSURL, outputURL: NSURL, handler:(session: AVAssetExportSession)-> Void) { let urlAsset = AVURLAsset(URL: inputURL, options: nil) let exportSession = AVAssetExportSession(asset: urlAsset, presetName: AVAssetExportPresetMediumQuality) exportSession!.outputURL = outputURL exportSession!.outputFileType = AVFileTypeQuickTimeMovie exportSession!.shouldOptimizeForNetworkUse = true exportSession!.exportAsynchronouslyWithCompletionHandler { () -> Void in handler(session: exportSession!) } }
当我在2秒钟内录制视频时,大小为 4.3 MB ,当我在6秒钟内录制视频时,文件的大小为 9.3 MB 。
有任何减小尺寸的提示吗?
此扩展专注于将其导出到较低质量的设置(在本例中为“中”),并使用mp4容器,而不是moviOS偏爱的容器。这可能会导致质量下降,但是您可以在尝试微调输出时尝试使用更高的输出设置和不同的格式。
mp4
mov
extension PreviewVideoViewController: AVCaptureFileOutputRecordingDelegate { func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) { guard let data = try? Data(contentsOf: outputFileURL) else { return } print("File size before compression: \(Double(data.count / 1048576)) mb") let compressedURL = NSURL.fileURL(withPath: NSTemporaryDirectory() + UUID().uuidString + ".mp4") compressVideo(inputURL: outputFileURL as URL, outputURL: compressedURL) { exportSession in guard let session = exportSession else { return } switch session.status { case .unknown: break case .waiting: break case .exporting: break case .completed: guard let compressedData = try? Data(contentsOf: compressedURL) else { return } print("File size after compression: \(Double(compressedData.count / 1048576)) mb") case .failed: break case .cancelled: break } } } func compressVideo(inputURL: URL, outputURL: URL, handler:@escaping (_ exportSession: AVAssetExportSession?) -> Void) { let urlAsset = AVURLAsset(url: inputURL, options: nil) guard let exportSession = AVAssetExportSession(asset: urlAsset, presetName: AVAssetExportPresetMediumQuality) else { handler(nil) return } exportSession.outputURL = outputURL exportSession.outputFileType = .mp4 exportSession.exportAsynchronously { handler(exportSession) } } }