每次都显示AVAssetExportSession状态失败

时间:2020-03-09 11:45:36

标签: ios swift

在这里,我将代码放在此处以在保存时压缩视频文件的大小,导出会话状态显示为失败,有人可以帮我解释一下我在做什么错误吗?

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)
        }
    }


}

0 个答案:

没有答案