这可以用 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 播放视频文件同步下载吗?的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire:如何按顺序下载文件

通过网络同步视频播放

什么播放器可以播放fsv格式的视频

MP4播放器支持啥格式的视频文件?

从网上下载了一个视频是vep格式的,请问用啥播放器可以打开

IPhone微信H5用Video标签播放不了视频