URLで動画からスクリーンショットを取得してキャッシュする

こんにちは、Gabrazhitel!

この短い記事では、最新のiOSプロジェクトの1つで、ビデオでの経験をもう一度共有したいと思います。 今回は、ビデオからスクリーンショットを取得することに焦点を当てます。



インターネットでこの問題の解決策をいくつか見つけましたが、それらはすべてMPMoviePlayerControllerを介して実装されていました 。 はい、これは解決策ですが、より高速で動作し、低速モバイルインターネットに最適な別の、おそらくより正確な解決策についてお話したいと思います。

この問題を解決するために必要なものは、標準クラスAVAssetImageGeneratorと、 SDWebImageと呼ばれる多くの人が知っているgithub上の素晴らしいプロジェクトだけです

まず、 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]; } 

これで、可変画像に表示できる画像があり、キャッシュに入れるのもいいでしょう。 SDImageCacheはこのタスクに役立ちます。

キャッシュに画像を配置するには、キーを生成する必要があります。キーを使用して、そこからキーを削除し、1つの関数のみを呼び出します

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


写真の取得も非常に簡単です。

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

ブロックでは、nilの画像を確認する必要があります。 理由を説明する必要はないと思います:)。

それだけです。たとえば、 animateWithDurationを使用して 、滑らかな外観など、いくつかの効果を画像に追加できます。

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


ご清聴ありがとうございました。コメントのすべての質問にお答えします。実際の例はこちらからご覧いただけます: https : //github.com/Borodutch/BSVideoThumbnails

Source: https://habr.com/ru/post/J240231/


All Articles