【问题标题】:Download Video using Alamofire and then Play on AV player使用 Alamofire 下载视频,然后在 AV 播放器上播放
【发布时间】:2017-08-04 09:05:49
【问题描述】:

我使用以下代码从URL 下载视频。下载视频效果很好。

func downloadVideo(){

    Alamofire.request("https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4").downloadProgress(closure:{ (progress) in
    print(progress.fractionCompleted)
    self.progressView.progress = Float(progress.fractionCompleted)

    }).responseData{ (response) in
       print(response.result)
       print(response.result.value!)
       print(response.result.description)

        if let data = response.result.value {
            let obj = String(data: data, encoding: .utf8)
            let player = AVPlayer(url: URL(string: obj!)!)
            self.playerController.player = player
            self.addChildViewController(self.playerController)
            self.view.addSubview(self.playerController.view)
            self.playerController.view.frame = self.view.frame
            player.play()

        }

    }

但是我想在AVPlayer播放这个视频

我发现视频可能下载为NSData。是吗? 谁能帮我下载完成后如何播放此视频?

如果有人能推荐一些其他的代码就好了 使用进度条下载视频,然后在 Swift 3.0 中播放。

TIA。

【问题讨论】:

  • let obj = String(data: data, encoding: .utf8); let player = AVPlayer(url: URL(string: obj!)!) 这没有意义。 obj应该是视频的内容(字节),怎么转成String呢?这应该是一个 URL 吗?
  • @Larme 我知道我走错了路。请建议一些更好的路径
  • 真的需要下载吗?为什么不直接做let player = AVPlayer(url: URL(string:"https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")!)?否则,您需要将data 保存到您的应用程序(FileManager 或类似的东西)的某个文件路径中,并将该路径用于AVPlayer(url: URL(string:myFilePath))
  • @Larme 为了将来的参考,我需要下载视频并将其存储到我的本地目录中。有没有其他方法可以做到这一点,然后在 AVPlayer 中播放。谢谢

标签: ios swift3 alamofire avplayer nsdata


【解决方案1】:

经过数小时的搜索

我想出了一个简单可靠的方法来转换 URL 中的 NSData 以便它可以被 AVPlayer 播放

func downloadVideo(){

    Alamofire.request("https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4").downloadProgress(closure : { (progress) in
    print(progress.fractionCompleted)
    self.progressView.progress = Float(progress.fractionCompleted)
    }).responseData{ (response) in
       print(response)
       print(response.result.value!)
       print(response.result.description)
        if let data = response.result.value {

            let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
            let videoURL = documentsURL.appendingPathComponent("video.mp4")
            do {
                try data.write(to: videoURL)
                } catch {
                print("Something went wrong!")
            }
            print(videoURL)
            let player = AVPlayer(url: videoURL as URL)
            self.playerController.player = player
            self.addChildViewController(self.playerController)
            self.view.addSubview(self.playerController.view)
            self.playerController.view.frame = self.view.frame
            player.play()
        }
    }
}

您可以使用以下这段代码来转换它

if let data = response.result.value {

            let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
            let videoURL = documentsURL.appendingPathComponent("video.mp4")
            do {
                try data.write(to: videoURL) // Pass this videoURL to AVPlayer after Downloading Video it will be played.
                } catch {
                print("Something went wrong!")
            }
            print(videoURL)

根据要求, 这是完整实现的源代码。

Download Source Code

P.S:- 这是考虑到一个演示。你们中的许多人会争辩说这段代码可以优化并且可以做得更好,但是是的 是一个演示,您可以根据具体情况选择部分或整体 您的要求

【讨论】:

  • 您的代码在表格视图中帮助了我很多,我可以显示视频,但在单页中我无法显示。有没有其他选项可以下载和播放
  • @UmaMadhavi 此代码仅用于单视图。您能否分享您的代码 sn-p 即您如何使用它,以便我可以看到您的问题。我已使用此当前代码下载(独奏视频),然后在 View Controller 中全屏播放 AV 播放器。
  • 你为什么使用 appendingPathComponent?
  • @Lakshay 访问我的名为“video.mp4”的文件。来消除你的疑惑。首先只打印 print(documentsURL),然后 print(videoURL)。看到变化,你的疑虑就会被消除。
  • @AbhirajsinhThakore 你能给我完整的来源吗?我正在开发一个流媒体应用程序,并想检查这是否适用于我的情况。谢谢!
猜你喜欢
  • 2018-03-21
  • 1970-01-01
  • 2012-03-28
  • 2017-07-19
  • 1970-01-01
  • 2011-10-01
  • 2014-05-01
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多