【问题标题】:Is this possible to play Video File synchronous downloading with Almofire?这可以用 Alamofire 播放视频文件同步下载吗?
【发布时间】: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()
                            }
}

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

谢谢

【问题讨论】:

    标签: ios swift avplayer alamofire


    【解决方案1】:

    您不需要 Alamofire 来流式传输在您的情况下是视频的内容。

    您实际上可以利用现有的 Apple 类,例如:

    使用这 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。那对我有用。我会进一步改进我的解决方案。
    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多