我尝试使用Alamofire
下载文件,我完成了进度。我现在要做的是从视频网址构建一种本地流。
Alamofire将下载的文件存储在目的地。
let destination = Alamofire.Request.suggestedDownloadDestination(directory: .DocumentDirectory, domain: .LocalDomainMask)
在我的情况下,此目的地无效。例如
if totalBytesRead >= 51831 {
let player = AVPlayer(URL: NSURL(fileURLWithPath: "\(destination)"))
let playerController = AVPlayerViewController()
playerController.player = player
self.presentViewController(playerController, animated: true) {
player.play()
}
}
还有其他办法吗?或者我可以将下载的字节存储到数组/缓冲区吗?
由于
答案 0 :(得分:2)
您不需要Alamofire来传输视频中的内容。
您实际上可以利用现有的Apple课程,例如:
使用这3个类,您可以创建自己的类,如VideoPlayer,将其用于流式传输。
以下是构建函数的代码片段,以帮助您入门:
playerItem = AVPlayerItem(URL: videoURL)
player = AVPlayer(playerItem: self.playerItem!)
playerLayer = AVPlayerLayer(player: self.player)
playerLayer?.frame = newFrame
playerLayer?.videoGravity = AVLayerVideoGravityResizeAspect
现在,您可以在另一个View Controller中使用此类:
self.containerView.layer.addSublayer(self.videoPlayer.playerLayer)
这将添加您创建的视频播放器类,现在您只需要播放视频:
// Of type AVPlayer
player.play()
这是一个简单的部分,如果你想要你必须实现自己的缓冲区&速率,当然还有一个观察者来观察速率和缓冲:
// Observe the Rate of the player. when the video playing or paused
player.addObserver(theSelf, forKeyPath: "rate", options: .New, context: nil)
// Observe when the Video player Buffer is empty
playerItem.addObserver(theSelf, forKeyPath: "playbackBufferEmpty", options: .New, context: nil)
// Observe the loaded Buffer of the video
playerItem.addObserver(theSelf, forKeyPath: "loadedTimeRanges", options: NSKeyValueObservingOptions.New, context: nil)
另外,完成后不要忘记删除它们。
修改强>
正如所提出的,如果您需要在运行时切换到更好的质量,首先需要观察用户的互联网速度。解决了这个问题后,您现在需要通过在当前图层上添加另一个VideoPlayer图层来流式传输高质量视频,但只有在新的高质量视频缓冲区至少有5秒左右时才会这样做,因此用户不会注意到这种变化。
祝你好运。