【问题标题】:Is it possible to cache Videos? IOS - Swift是否可以缓存视频? IOS - 斯威夫特
【发布时间】:2017-05-23 21:40:04
【问题描述】:

我正在尝试在 Instagram、vine 甚至 facebook 等 tableView 中下载和播放视频。

我想要实现的是一个 tableView,我在其中显示视频,并且它们在滚动时自动下载和播放。喜欢 Instagram...

到目前为止,我已经完成了大部分工作,但我想改变的是,每次查看单元格时,视频都会一次又一次地下载......当然必须有一种方法来缓存视频,或者只下载一次相同的视频....就像您使用 SDWebImages 获取图像一样。

现在每次查看单元格时都会下载它,滚动效果可想而知。

现在我似乎无法弄清楚 Instagram 是如何做到的,但我 100% 确定他们不会多次下载同一个视频!

如果有人有建议或想法,我很想听听他们的意见!!

非常感谢。

【问题讨论】:

  • 我需要完全相同的功能......在滚动和缓存视频时显示视频......你是怎么做到的?
  • 我需要和你的实现一模一样,能在这里分享一下你的实现方式吗?

标签: ios swift uitableview caching video


【解决方案1】:

使用 Haneke,我无法检索缓存视频的文件路径。我通过将视频保存在缓存目录中来处理它。

public enum Result<T> {
    case success(T)
    case failure(NSError)
}

class CacheManager {

    static let shared = CacheManager()

    private let fileManager = FileManager.default

    private lazy var mainDirectoryUrl: URL = {

        let documentsUrl = self.fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first!
        return documentsUrl
    }()

    func getFileWith(stringUrl: String, completionHandler: @escaping (Result<URL>) -> Void ) {


        let file = directoryFor(stringUrl: stringUrl)

        //return file path if already exists in cache directory
        guard !fileManager.fileExists(atPath: file.path)  else {
            completionHandler(Result.success(file))
            return
        }

        DispatchQueue.global().async {

            if let videoData = NSData(contentsOf: URL(string: stringUrl)!) {                    
                videoData.write(to: file, atomically: true)

                DispatchQueue.main.async {
                    completionHandler(Result.success(file))
                }
            } else {
                DispatchQueue.main.async {
                    completionHandler(Result.failure(NSError.errorWith(text: "Can't download video")))
                }
            }
        }
    }

    private func directoryFor(stringUrl: String) -> URL {

        let fileURL = URL(string: stringUrl)!.lastPathComponent

        let file = self.mainDirectoryUrl.appendingPathComponent(fileURL)

        return file
    }
}

这个类的示例用法如下所示:

CacheManager.shared.getFileWith(stringUrl: "http://techslides.com/demos/sample-videos/small.mp4") { result in

        switch result {
        case .success(let url):
             // do some magic with path to saved video                
        case .failure(let error):
            // handle errror
        }
    }

【讨论】:

  • 那我该如何清理缓存呢?我必须手动完成还是自动清理缓存目录?
  • @TomSawyer 自动清理
  • @mkkrolik 我也想要下载百分比。
  • 喜欢这个,非常简单,不需要第三方库
  • 如何播放来自 onSuccess 的视频?对我来说,这不适用于检索到的 url
【解决方案2】:

好问题。最好的办法是在 Github 上使用一些开源和 3rd 方的东西。我仅将它们用于图像,但我相信它们也会为您加载和缓存视频。以下是一些流行的链接...

https://github.com/onevcat/Kingfisher https://github.com/Haneke/HanekeSwift 还有一个很好的库列表,您可能会觉得有用... https://github.com/Wolg/awesome-swift

希望这会有所帮助!

【讨论】:

  • 非常感谢您的回答。我会看看你们的图书馆,希望我会发现它们有用!
  • @Charles 你创立了什么?
  • @VladPulichev 你找到什么了吗?
  • @FaridAlHaddad :D 我可能会实施 Haneke
  • 你可以用 haneke 做到这一点吗?不是图片吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2017-07-22
  • 2017-03-24
  • 2019-07-02
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多