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



All Articles