在我的一个项目中,我从服务器下载了一个远程mp4视频并将其保存在" Documents" iOS设备的文件夹(Swift 3,iOS 10)。 我曾尝试使用AVPlayer以多种方式播放本地视频(使用URL,使用AVPlayerItem / AVAsset等)但我总是以这样的屏幕结束:
这是我试图用来播放文件的代码的最后一个版本:
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文件夹中是否包含视频,并且网址/路径是否正确,看起来是这样。
我还尝试使用segue从故事板中使用单独的AVKit视图控制器来处理这个问题,但结果并没有改变。
我想知道是否需要某些内容,例如为了安全起见你必须在Info.plist上播放以播放远程文件的更改,但在这种情况下它是本地文件因此我&#39 ;缺乏想法。
有谁知道视频文件无法播放的原因?
更新: 我刚刚意识到,分析应用程序的沙箱 (There's a way to access the document folder in iphone/ipad (real device, no simulator)?),我保存的文件以某种方式被破坏(它应该是22 MB的东西,但在沙箱中它只有几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网址格式有关。 要下载该文件,您需要这样的链接: 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)
(我使用了故事板和segue中的视图控制器,只使用了网址(不需要项目和资产)。
希望这有助于其他人努力从Dropbox保存远程视频并在本地播放。
答案 0 :(得分:0)
试试这样:
let asset = AVAsset(URL: your_videoUrl)
let item = AVPlayerItem(asset: asset)
let player = AVPlayer(playerItem: item)