Невозможно создать миниатюры видео с кешем в Swift
Изо всех сил пытался заставить это работать. Я создаю миниатюры видео, но они действительно загружаются в виде коллекции. Я хотел бы их кешировать и не могу найти решение.
Это код, который я использую:
func previewImageFromVideo(url:NSURL) -> UIImage? {
let asset = AVAsset(url: url as URL)
let imageGenerator = AVAssetImageGenerator(asset:asset)
imageGenerator.appliesPreferredTrackTransform = true
imageGenerator.maximumSize = CGSize(width: 250, height: 120)
var time = asset.duration
time.value = min(time.value,2)
do {
let imageRef = try imageGenerator.copyCGImage(at: time, actualTime: nil)
return UIImage(cgImage: imageRef)
} catch {
return nil
}
}
Я сделал их очень маленькими, но все равно каждый раз подключаюсь к серверу. Пожалуйста помоги.
3 ответа
Решение
Вы можете использовать URLCache
:
func previewImageFromVideo(url: NSURL) -> UIImage? {
let url = url as URL
let request = URLRequest(url: url)
let cache = URLCache.shared
if
let cachedResponse = cache.cachedResponse(for: request),
let image = UIImage(data: cachedResponse.data)
{
return image
}
let asset = AVAsset(url: url)
let imageGenerator = AVAssetImageGenerator(asset: asset)
imageGenerator.appliesPreferredTrackTransform = true
imageGenerator.maximumSize = CGSize(width: 250, height: 120)
var time = asset.duration
time.value = min(time.value, 2)
var image: UIImage?
do {
let cgImage = try imageGenerator.copyCGImage(at: time, actualTime: nil)
image = UIImage(cgImage: cgImage)
} catch { }
if
let image = image,
let data = UIImagePNGRepresentation(image),
let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: nil, headerFields: nil)
{
let cachedResponse = CachedURLResponse(response: response, data: data)
cache.storeCachedResponse(cachedResponse, for: request)
}
return image
}
Я создал это расширение для создания и кэширования видео миниатюр видео из файлового менеджера.
Вы можете использовать как это так:
let videoURL = URL(fileURLWithPath: self.videoPath)
let thumbnailImage = videoURL.createVideoThumbnail()
Код расширения:
let imageCache = NSCache<AnyObject, AnyObject>()
extension URL {
func createVideoThumbnail() -> UIImage? {
if let imageFromCache = imageCache.object(forKey: self as AnyObject) as? UIImage {
return imageFromCache
}
let asset = AVAsset(url: self)
let imageGenerator = AVAssetImageGenerator(asset: asset)
imageGenerator.appliesPreferredTrackTransform = true
imageGenerator.maximumSize = CGSize(width: 250, height: 120)
var time = asset.duration
time.value = min(time.value, 2)
do {
let cgImage = try imageGenerator.copyCGImage(at: time, actualTime: nil)
let image = UIImage(cgImage: cgImage)
imageCache.setObject(image as AnyObject, forKey: self as AnyObject)
return image
} catch let err {
print(err)
}
return UIImage()
}
Вы можете использовать Kingfisher для создания эскиза.
Примечание. Он выполнит всю работу с кешем за вас.
Использование:-
Шаг 1
import Kingfisher
Шаг 2
guard let url = URL(string: videoUrlString) else { return }
self.imageView.kf.setImage(with: AVAssetImageDataProvider(assetURL: url, seconds: 1))
Вот ссылка Kingfisher SDK
Примечание:- Он будет нормально работать с последней версией kingfisher/выше или равной версии 7.2.3.