Здравствуй, Хабражитель!
В этой маленькой статье я хочу опять поделиться своим опытом работы с видео в одном из последних проектов для 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