2017-02-07 4 views
0

I'm trying to save a video in my app directory and then play it back in my view controller. I'm having an issue with saving and making the path. Can anyone help?Wie wird das Video in das Verzeichnis der App gespeichert und im View-Controller wiedergegeben?

func imagePickerController (_ Picker: UIImagePickerController, didFinishPickingMediaWithInfo Infos: [String: Alles]) {

 // Save the video to the app directory 
     let videoURL = info[UIImagePickerControllerMediaURL] as! NSURL 
     let videoData = NSData(contentsOf: videoURL as URL) 
     let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) 
     let documentsDirectory: AnyObject = paths[0] as AnyObject 
     let dataPath = documentsDirectory.appendingPathComponent("/vid1.mp4") 

     videoData?.write(toFile: dataPath, atomically: false) 
     self.dismiss(animated: true, completion: nil) 

} 

@IBAction func playVideoAction(_ sender: Any) 
{ 
    let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) 
    let documentsDirectory: AnyObject = paths[0] as AnyObject 
    let dataPath = documentsDirectory.appendingPathComponent("/vid1.mp4") 

    let videoAsset = (AVAsset(url: NSURL(fileURLWithPath: dataPath) as URL)) 
    let playerItem = AVPlayerItem(asset: videoAsset) 

    let player = AVPlayer(playerItem: playerItem) 
    let playerViewController = AVPlayerViewController() 
    playerViewController.player = player 

    self.present(playerViewController, animated: true) 
    { 
     playerViewController.player!.play() 
    } 
} 

how to save video file into document directory

I-Code von dieser Verbindung verwendet haben, aber mit dem Update zu xcode 8/swift 3 ist es nicht so hilfreich. Habe jetzt eine Weile auf diesem Problem festgefahren.

+0

Bitte senden Sie einen Code. Was hast du probiert? – onnoweb

+0

Die erste Zeile, wenn geklickt wird, zeigt meinen Code, aber ich werde versuchen, meinen Beitrag so zu bearbeiten, dass er sofort sichtbar ist. Neu im Stackoverflow und beim Posten von Bildern. –

Antwort

0

Sie möchten PHImageManager.requestExportSession(forVideo:options:) verwenden. Dadurch wird das Asset asynchron vorbereitet (einschließlich des Herunterladens bei Bedarf) und ein AVExportSession erstellt, den Sie zum Speichern der Datei verwenden können. Indem Sie angeben, dass Sie das Original möchten, und den Inhalt durchreichen (wenn möglich), sollten Sie das beste verfügbare Video erhalten.

var dataPath: URL { 
    let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) 
    let documentsDirectory = URL(fileURLWithPath: paths[0]) 
    return documentsDirectory.appendingPathComponent("/vid1.mp4") 
} 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    let url = info[UIImagePickerControllerReferenceURL] as! URL 

    let assets = PHAsset.fetchAssets(withALAssetURLs: [url], options: nil) 
    let asset = assets.object(at: 0) 
    let options = PHVideoRequestOptions() 
    options.version = .original 
    PHImageManager.default().requestExportSession(forVideo: asset, options: options, exportPreset: AVAssetExportPresetPassthrough) { (exportSession, info) in 
     guard let session = exportSession else { return } 
     session.outputURL = self.dataPath 
     session.outputFileType = AVFileTypeMPEG4 
     session.exportAsynchronously { 
      DispatchQueue.main.async { 
       self.dismiss(animated: true, completion: nil) 
      } 
     } 
    } 
} 

Wenn Sie die Wiedergabe wollte nicht auf die Festplatte speichern, aber nur, können Sie requestPlayerItem verwenden ein AVPlayerItem Sie in Ihrem Player verwenden können, zu erhalten:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    let url = info[UIImagePickerControllerReferenceURL] as! URL 

    let assets = PHAsset.fetchAssets(withALAssetURLs: [url], options: nil) 
    let asset = assets.object(at: 0) 
    let options = PHVideoRequestOptions() 
    options.version = .original 
    PHImageManager.default().requestPlayerItem(forVideo: asset, options: options) { (playerItem, info) in 
     let player = AVPlayer(playerItem: playerItem) 
     let playerViewController = AVPlayerViewController() 
     playerViewController.player = player 

     DispatchQueue.main.async { 
      self.dismiss(animated: true, completion: nil) 
      self.present(playerViewController, animated: true) { 
       playerViewController.player!.play() 
      } 
     } 
    } 
} 
+0

Danke, ich schätze die Antwort und neue Sichtweise. Können Sie mir zeigen, wie die playVideoAction-Methode aussehen würde? Ich implementiere das requestPlayerItem, aber ich glaube nicht, dass ich es richtig gemacht habe. –

Verwandte Themen