2017-02-07 22 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?ビデオをアプリケーションのディレクトリに保存し、ビューコントローラで再生するにはどうすればいいですか?

FUNCのimagePickerController(_ピッカー:UIImagePickerController、didFinishPickingMediaWithInfo情報:[文字列:任意])私は、このリンクからではなく、更新にコードを使用した {

 // 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

xcode 8/swift 3にはそれほど有用ではありません。今この問題にしばらくお待ちしています。

+0

いくつかのコードを投稿してください。何を試しましたか? – onnoweb

+0

クリックしたときの最初の行には自分のコードが表示されますが、すぐに表示されるように私の投稿を編集しようとします。 stackoverflowと写真の投稿が新しくなりました。 –

答えて

0

PHImageManager.requestExportSession(forVideo:options:)を使用します。これにより、資産を非同期的に準備し(必要に応じてダウンロードするなど)、ファイルを保存するために使用できるAVExportSessionを作成します。オリジナルを指定し、コンテンツをパススルーするように指定することにより(可能な場合)、最高品質のビデオを入手する必要があります。

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

あなたは、ディスクに保存したくなかったが、ただ再生、あなたはあなたのプレーヤーで使用することができますAVPlayerItemを取得するためにrequestPlayerItemを使用することができた場合:

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

ありがとう、私はそれを見るための答えと新しい方法に感謝します。 playVideoActionメソッドの外観を教えてください。私はrequestPlayerItemを実装しますが、私はそれを正しくしたとは思いません。 –

関連する問題