2017-05-27 2 views
1

私のプロジェクトでは、サーバーからリモートmp4ビデオをダウンロードし、iOSデバイス(Swift 3、iOS 10)の「Documents」フォルダに保存します。 私は(など、AVPlayerItem/AVAssetを使用して、URLで)いくつかの方法でAVPlayerを使用して、ローカルビデオを再生しようとしましたが、私はいつもこのような画面になってしまう:iOS 10のSwift 3:デバイスのDocumentsフォルダからmp4/movローカルビデオファイルを再生する方法は?

Video playing doesn't start

をこれがあります私はドキュメントフォルダに動画が含まれていることをチェックしました

let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) 
if let docDir : URL = urls.first { 
    let component = self.videoTutorialsEntries[indexPath.row].filename 
    let videoUrl = docDir.appendingPathComponent(component) 

    do { 
     let videoExists : Bool = try videoUrl.checkResourceIsReachable() 
     if videoExists {       
      let player = AVPlayer(url: videoUrl) 
      let playerController = AVPlayerViewController() 
      playerController.player = player 
      self.present(playerController, animated: true) { 
       playerController.player!.play() 
      } 
     } else { 
      print("Video doesn't exist") 
     } 
    } catch let error as NSError { 
     print(error) 
    } 
} 

、およびURL /パスが正しいこと、そしてそれがそう思わ:コードの最後のバージョンは、私は、ファイルを再生するために使用しようとしています。

私はまた、segueを使用してストーリーボードから別のAVKitビューコントローラーでこれを処理しようとしましたが、結果は変わりません。

セキュリティ上の理由から、リモートファイルを再生するためにInfo.plistを実行する必要があるなどの変更が必要なのかどうかは疑問ですが、ローカルファイルなのでアイデアが足りません。

誰もビデオファイルが再生されない理由を知っていますか?

UPDATE: 私は何とか破損している私が保存したファイルは(22メガバイトのようなものになるはずだと、アプリ (There's a way to access the document folder in iphone/ipad (real device, no simulator)?)のサンドボックスを分析し、実現したが、サンドボックスで、それはわずか数KBですこれは、問題が保存手順にあることを意味します)。 私はDropboxの上の私のリモートファイルを持っており、この技術を使用してファイル保存します。私は問題ができると仮定している私は(ダウンロードは動作します)pdfファイルのためにも、この非同期処理を使用しましたので

// Necessary when the remote server doesn't send the file size 
var request = URLRequest(url: self.videoUrl, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringCacheData, timeoutInterval: 30.0) 
request.httpMethod = "HEAD"; 
request.timeoutInterval = 5; 
let group = DispatchGroup() 
group.enter() 
URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) -> Void in 
    if error != nil { 
     DispatchQueue.main.async(execute: { 
      self.showAlert(title: NSLocalizedString("Video Unreachable", comment: "Video Unreachable Title"), message: NSLocalizedString("It was not possible to download the video file!", comment: "Video Not Downloaded Title")) 
     }) 
    } else { 
     DispatchQueue.main.async(execute: { 
      self.contentLength = response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown 
      group.leave() 
      self.progressLabel?.center = CGPoint(x:UIScreen.main.bounds.size.width/2, y:(self.pointInTable.y/2)+40) 
      self.progressLabel?.isHidden = false 
     })           
     self.downloadVideo() 
    } 
}).resume() 

func downloadVideo() { 
    self.isVideo = true 
    downloadTask = backgroundSession.downloadTask(with: self.videoUrl) 
    downloadTask.resume() 
} 

をビデオへのドロップボックスのリンクになります。その可能性のある問題に関するアイデアはありますか?

更新日: 私は最終的にファイルを再生することができました! 問題は、私が使用していたDropboxのURLフォームに関連していました。 https://www.dropbox.com/s/xxxxxxxxxxxx/xxxxxx.mp4?dl=1

ファイルをダウンロードしたい、そしてそれを視覚化していないことを意味し、最終的な「DL = 1?」と: は、ファイルをダウンロードするためには、このようなリンクを必要とします。私はそれを逃していた。

最後に、すべてがコードのこの作品で働い:

let fileManager = FileManager.default 
let docsUrl = try! fileManager.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) 
let component = self.videoTutorialsEntries[indexPath.row].filename 
let fileUrl = docsUrl.appendingPathComponent(component) 
performSegue(withIdentifier: "showLocalVideo", sender: fileUrl) 

(私はただのURLアイテムと資産の(不要)で、ストーリーボードとセグエからのビューコントローラを使用していた

。これは他の誰かがDropboxのからの遠隔映像を保存し、ローカルに遊んで苦労役立ちます

希望

答えて

0

はこのようにしてみてください。

let asset = AVAsset(URL: your_videoUrl) 
let item = AVPlayerItem(asset: asset) 
let player = AVPlayer(playerItem: item) 
+1

ありがとうございます、私は資産と商品も試しましたが、残念ながら結果は変わりません。 – Thorh73

関連する問題