在这里,我将代码放在此处以在保存时压缩视频文件的大小,导出会话状态显示为失败,有人可以帮我解释一下我在做什么错误吗?
import UIKit
import AVKit
import MobileCoreServices
class ViewController: UIViewController,UINavigationControllerDelegate,UIImagePickerControllerDelegate{
var controller = UIImagePickerController()
var videofileName = "/video.mp4"
var compressedfile = "/compressedvideo.mp4"
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func recordVideo(_ sender: Any) {
if UIImagePickerController.isSourceTypeAvailable(.camera){
controller.sourceType = .camera
controller.mediaTypes = [kUTTypeMovie as String]
controller.delegate = self
controller.videoQuality = .type640x480
self.present(controller, animated: true, completion: nil)
}else{
print("camera not available")
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
// 1
if let selectedVideo:URL = (info[UIImagePickerController.InfoKey.mediaURL] as? URL) {
// Save video to the main photo album
let selectorToCall = #selector(videoSaved(_:didFinishSavingWithError:context:))
// 2
UISaveVideoAtPathToSavedPhotosAlbum(selectedVideo.relativePath, self, selectorToCall, nil)
// Save the video to the app directory
let videoData = try? Data(contentsOf: selectedVideo)
print("\(videoData)")
let paths = NSSearchPathForDirectoriesInDomains(
FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
let documentsDirectory: URL = URL(fileURLWithPath: paths[0])
let dataPath = documentsDirectory.appendingPathComponent(videofileName)
print(dataPath)
let compresseddataPath = documentsDirectory.appendingPathComponent(compressedfile)
print(compresseddataPath)
compressVideo(inputURL: dataPath, outputURL: compresseddataPath, handler: { (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 = NSData(contentsOf: compresseddataPath) else {
return
}
print("File size after compression: \(Double(compressedData.length / 1048576)) mb")
case .failed:
break
case .cancelled:
break
}
DispatchQueue.main.sync {
self.dismiss(animated: true, completion: nil)
}
})
try! videoData?.write(to: dataPath, options: [])
}
// 3
picker.dismiss(animated: true)
}
@objc func videoSaved(_ video: String, didFinishSavingWithError error: NSError!, context: UnsafeMutableRawPointer){
if let theError = error {
print("error saving the video = \(theError)")
} else {
DispatchQueue.main.async(execute: { () -> Void in
})
}
}
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: AVAssetExportPresetLowQuality) else {
handler(nil)
return
}
exportSession.outputURL = outputURL
exportSession.outputFileType = AVFileType.mov
exportSession.shouldOptimizeForNetworkUse = true
exportSession.exportAsynchronously { () -> Void in
handler(exportSession)
}
}
}