2017-05-27 2 views
1

dans un de mes projets Je télécharge une vidéo mp4 distante à partir d'un serveur et l'enregistre dans le dossier "Documents" de l'appareil iOS (Swift 3, iOS 10). J'ai essayé de lire la vidéo locale en utilisant AVPlayer de plusieurs façons (avec l'URL, en utilisant AVPlayerItem/AVAsset, etc.), mais je finis toujours avec un écran comme celui-ci:Swift 3 sur iOS 10: comment lire un fichier vidéo local mp4/mov à partir du dossier Documents de l'appareil?

Video playing doesn't start

C'est la dernière version du code que je suis en train d'utiliser pour lire le fichier:

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

J'ai vérifié que le dossier Documents contient la vidéo, et que l'URL/chemin est correct, et il semble donc.

J'ai également essayé de gérer cela avec un contrôleur de vue AVKit séparé du storyboard, en utilisant segue, mais le résultat ne change pas. Je me demande si quelque chose est nécessaire comme le changement que pour des raisons de sécurité vous devez effectuer sur Info.plist pour lire les fichiers distants, mais dans ce cas c'est un fichier local donc je suis à court d'idées.

Est-ce que quelqu'un sait la raison pour laquelle le fichier vidéo ne joue pas?

MISE À JOUR: Je viens de réaliser, analyser le bac à sable de l'application (There's a way to access the document folder in iphone/ipad (real device, no simulator)?), que le fichier que j'ai sauvé est corrompu en quelque sorte (il est censé être quelque chose comme 22 Mo, mais dans le bac à sable, il est juste quelques Ko , ce qui signifie que le problème devrait être dans la procédure d'enregistrement). J'ai mon fichier distant sur Dropbox, et enregistrez le fichier avec cette technique:

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

Depuis que je l'ai utilisé ce traitement asynchrone également pour les fichiers PDF (où les travaux de téléchargement) Je suppose que la question pourrait être le lien de la boîte de dépôt vers la vidéo. Des idées sur des problèmes possibles avec cela?

MISE À JOUR: J'ai finalement réussi à lire le fichier! Le problème était lié à la forme d'URL Dropbox que j'utilisais. Pour télécharger le fichier que vous avez besoin d'un lien comme celui-ci: https://www.dropbox.com/s/xxxxxxxxxxxx/xxxxxx.mp4?dl=1

avec la finale « dl = 1? » Cela signifie que vous souhaitez télécharger le fichier, et non simplement à visualiser. Il me manquait ça.

Enfin, tout travaillé avec ce morceau de code:

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) 

(j'ai utilisé le contrôleur de vue du story-board et le Segue, juste avec urls (pas besoin d'éléments et actifs)

.

Hope this helps quelqu'un d'autre aux prises avec l'économie vidéo à distance de Dropbox et jouer localement

Répondre

0

Essayez comme ceci:.

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

Merci, j'ai essayé aussi avec l'actif et l'élément mais malheureusement le résultat ne change pas. – Thorh73