从视频中检索缩略图 - 目标C.

时间:2014-03-17 18:16:42

标签: ios iphone objective-c

我有一个将视频上传到服务器的应用程序,现在我想要创建的是一个新闻源,用于显示这些视频帖子,但是通过缩略图或视频帧。因此,一旦用户点击缩略图,视频就会播放。

我有以下代码用于从服务器获取视频并播放它:

- (void)openVideo {

    NSString *videoURLString = @"http://myite.com/dev/iphone/uploads/t69566.mov";
    NSURL *videoURL = [NSURL URLWithString:videoURLString];
    MPMoviePlayerViewController *moviePlayerView = [[[MPMoviePlayerViewController alloc] initWithContentURL:videoURL] autorelease];

    [self presentMoviePlayerViewControllerAnimated:moviePlayerView];

} 

现在很粗糙我想让openVideo充满动态的视频帖子,但是我不得不拍摄这个视频并抓住一个框架或缩略图并显示它。

连连呢?想法?

更新:

我想从服务器拍摄的视频中截取缩略图。这实际上给我带来了一个问题。

当用户首次上传视频时,最好只在那里创建一个缩略图并将其上传到我的服务器,并将其与视频相关联,抓住它们以填充新闻Feed类型?

1 个答案:

答案 0 :(得分:5)

您可以使用AVAssetImageGenerator执行此操作。粗糙的代码,从工作项目中复制和粘贴(但可能没有被正确隔离):

  • _thumbnailView是显示缩略图的UIImageView
  • _activityViewUIActivityIndicatorView,在缩略图完成加载时会隐藏。

    AVPlayerItem *playerItem = [[AVPlayerItem playerItemWithURL:movieURL] retain];
    AVAssetImageGenerator *_generator;
    _generator = [[AVAssetImageGenerator assetImageGeneratorWithAsset:playerItem.asset] retain];
    [playerItem release];
    
    AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
        if (result == AVAssetImageGeneratorSucceeded) {
            UIImage *thumb = [UIImage imageWithCGImage:image];
            [_thumbnailView setImage:thumb forState:UIControlStateNormal];
        } else {
            DLog(@"%s - error: %@", __PRETTY_FUNCTION__, error);
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            _thumbnailView.hidden = NO;
            _playButton.hidden = NO;
            [_activityView stopAnimating];
        });
    };
    
    [_generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:CMTimeMakeWithSeconds(30,30)]] completionHandler:handler];
    

回到你的问题,在我看来,服务器端生成的缩略图通常更好,因为服务器具有更强的处理能力。此外,为了获得此缩略图,您需要开始从服务器下载实际视频。

最后,并非您传递CMTime参数,包括对CMTimeMakeWithSeconds()的调用。这可能会有问题,因为您可以轻松打出空白帧。这就是我们使用30作为参数的原因,因此我们在视频中避免这种情况。