Pull to refresh

Получение и кэширование скриншота из видео по URL

Reading time2 min
Views4.6K
Здравствуй, Хабражитель!

В этой маленькой статье я хочу опять поделиться своим опытом работы с видео в одном из последних проектов для iOS. На этот раз речь пойдет о получении скриншота из видео.



На просторах интернета я встретил несколько решений этой задачи, но все они были реализованы через MPMoviePlayerController. Да, это решение, но я хочу рассказать о другом, возможно более правильном решении, которое работает быстрее и отлично подходит для низкоскоростного мобильного интернета.

В решении этой задачи нам понадобится всего две вещи: стандартный класс AVAssetImageGenerator и просто отличный проект на гитхабе, о котором многие знают, под названием SDWebImage.

Для начала получаем картинку с помощью AVAssetImageGenerator

NSURL *videoURL = [NSURL URLWithString:@"video_url"]
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
NSError *error;
CGImageRef imageRef = [generator copyCGImageAtTime:CMTimeMake(1, 2) actualTime:NULL error:&error];
if (!error) {
	UIImage *image = [[UIImage alloc] initWithCGImage:ref];
}

Теперь в переменной image мы имеем картинку, которую можно показать, а так же хорошо бы положить в кэш. С этой задачей нам поможет SDImageCache.

Чтобы положить изображение в кэш, нужно сформировать ключ, по которому мы ее потом будем оттуда вынимать, и вызвать всего одну функцию

NSString *imageCacheKey = [[@"video_url" lastPathComponent] stringByDeletingPathExtension];
[[SDImageCache sharedImageCache] storeImage:image forKey:imageCacheKey];


Достать картинку тоже довольно просто

[[SDImageCache sharedImageCache] queryDiskCacheForKey:imageCacheKey done:^(UIImage *image, SDImageCacheType cacheType) {
	if (image) {
           
	}
}];

В блоке нужно обязательно проверить image на nil. Думаю не нужно объяснять зачем :).

На этом все, можно добавить картинке пару эффектов по вкусу, например плавное появление через animateWithDuration

self.photo.image = image;
[UIView animateWithDuration:0.25 animations:^{
	self.photo.alpha = 1.f;
}];


Всем спасибо за внимание, на все вопросы постараюсь ответить в комментариях, рабочий пример можно взять тут: https://github.com/Borodutch/BSVideoThumbnails
Tags:
Hubs:
Total votes 12: ↑7 and ↓5+2
Comments0

Articles