这可以用 Alamofire 播放视频文件同步下载吗?
Posted
技术标签:
【中文标题】这可以用 Alamofire 播放视频文件同步下载吗?【英文标题】:Is this possible to play Video File synchronous downloading with Almofire? 【发布时间】:2016-09-15 11:17:27 【问题描述】:我尝试使用Alamofire
下载文件,并且取得了进展。我现在要做的是从视频 URL 构建一种本地流。
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】:您不需要 Alamofire 来流式传输在您的情况下是视频的内容。
您实际上可以利用现有的 Apple 类,例如:
AVPlayerItem AVPlayerLayer AVPlayer使用这 3 个类,您可以创建自己的类,例如 VideoPlayer,将它们用于流式传输。
以下是构造函数的代码片段,可帮助您入门:
playerItem = AVPlayerItem(URL: videoURL)
player = AVPlayer(playerItem: self.playerItem!)
playerLayer = AVPlayerLayer(player: self.player)
playerLayer?.frame = newFrame
playerLayer?.videoGravity = AVLayerVideoGravityResizeAspect
现在,您可以在另一个视图控制器中使用这个类:
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 秒左右时才这样做,所以用户不会注意到变化。
祝你好运。
【讨论】:
首先感谢您的回复。我在 AVPlayer 工作。实际上我想在两种品质之间切换,我有两个不同品质的相同视频的网址。我尝试在本地切换它,而不会像 youtube 那样停止播放视频。所以我想开始玩低质量和互联网速度切换到预下载的高质量。我认为在 Youtube 上切换视频质量是我的要求。任何更好的解决方案或任何建议 youtube 如何做到这一点。 如果需要切换,首先需要观察用户的网速。解决此问题后,您现在需要流式传输高质量视频,例如在当前层的顶部添加另一个 VideoPlayer 层,但只有在新的高质量视频缓冲区至少有 5 秒左右时才这样做,所以用户不会注意到变化。 是的,这是非常合适的解决方案。现在我必须维护两个 AVPlayer + AVPlayerLayer 实例并根据我的要求进行切换。让我试试。我会带着新的进步回来。非常感谢 OhadM。 非常感谢 OhadM。那对我有用。我会进一步改进我的解决方案。以上是关于这可以用 Alamofire 播放视频文件同步下载吗?的主要内容,如果未能解决你的问题,请参考以下文章