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

На просторах интернета я встретил несколько решений этой задачи, но все они были реализованы через MPMoviePlayerController. Да, это решение, но я хочу рассказать о другом, возможно более правильном решении, которое работает быстрее и отлично подходит для низкоскоростного мобильного интернета.
В решении этой задачи нам понадобится всего две вещи: стандартный класс AVAssetImageGenerator и просто отличный проект на гитхабе, о котором многие знают, под названием SDWebImage.
Для начала получаем картинку с помощью AVAssetImageGenerator
Теперь в переменной image мы имеем картинку, которую можно показать, а так же хорошо бы положить в кэш. С этой задачей нам поможет SDImageCache.
Чтобы положить изображение в кэш, нужно сформировать ключ, по которому мы ее потом будем оттуда вынимать, и вызвать всего одну функцию
Достать картинку тоже довольно просто
В блоке нужно обязательно проверить image на nil. Думаю не нужно объяснять зачем :).
На этом все, можно добавить картинке пару эффектов по вкусу, например плавное появление через animateWithDuration
Всем спасибо за внимание, на все вопросы постараюсь ответить в комментариях, рабочий пример можно взять тут: https://github.com/Borodutch/BSVideoThumbnails
В этой маленькой статье я хочу опять поделиться своим опытом работы с видео в одном из последних проектов для 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