是否可以使用Almofire播放视频文件同步下载?

时间:2016-09-15 11:17:27

标签: ios swift avplayer alamofire

我尝试使用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()
                            }
}

还有其他办法吗?或者我可以将下载的字节存储到数组/缓冲区吗?

由于

1 个答案:

答案 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秒左右时才会这样做,因此用户不会注意到这种变化。

祝你好运。