Video iOS 10上的Swift 3:如何从设备文档文件夹播放mp4/mov本地视频文件?

Video iOS 10上的Swift 3:如何从设备文档文件夹播放mp4/mov本地视频文件?,video,swift3,dropbox,ios10,nsdocumentdirectory,Video,Swift3,Dropbox,Ios10,Nsdocumentdirectory,在我的一个项目中,我从服务器下载了一个远程mp4视频,并将其保存在iOS设备(Swift 3、iOS 10)的“Documents”文件夹中。 我曾尝试以多种方式(使用URL、使用AVPlayerItem/AVAsset等)使用AVPlayer播放本地视频,但最终的屏幕总是这样: 这是我试图用来播放该文件的代码的最后一个版本: let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) if

在我的一个项目中,我从服务器下载了一个远程mp4视频,并将其保存在iOS设备(Swift 3、iOS 10)的“Documents”文件夹中。 我曾尝试以多种方式(使用URL、使用AVPlayerItem/AVAsset等)使用AVPlayer播放本地视频,但最终的屏幕总是这样:

这是我试图用来播放该文件的代码的最后一个版本:

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)
     }
}
我已经检查了Documents文件夹是否包含视频,URL/路径是否正确,看起来是这样的

我还尝试使用segue从故事板中分离出一个AVKit视图控制器来处理这个问题,但结果没有改变

我想知道是否有必要做一些更改,例如出于安全原因,您必须在Info.plist上执行更改才能播放远程文件,但在这种情况下,它是本地文件,因此我缺乏想法

有人知道视频文件无法播放的原因吗

更新: 我刚刚意识到,正在分析应用程序的沙盒 (),我保存的文件不知怎么被破坏了(应该是22MB,但在沙箱中只有几KB,这意味着问题应该在保存过程中)。 我将远程文件放在Dropbox上,并使用以下技术保存文件:

// 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()
}
由于我也对pdf文件使用了这种异步处理(在下载的地方),我假设问题可能是视频的dropbox链接。关于可能的问题有什么想法吗

更新: 我终于设法播放了这个文件! 这个问题与我使用的Dropbox url表单有关。 要下载文件,您需要以下链接:

最后一个“?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)
(我使用了故事板和segue中的视图控制器,只使用URL(不需要项目和资产)

希望这能帮助其他人从Dropbox保存远程视频并在本地播放。

尝试以下方法:

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

谢谢,我也尝试过资产和物品,但不幸的是结果没有改变。