我有一个将视频上传到服务器的应用程序,现在我想要创建的是一个新闻源,用于显示这些视频帖子,但是通过缩略图或视频帧。因此,一旦用户点击缩略图,视频就会播放。
我有以下代码用于从服务器获取视频并播放它:
- (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类型?
答案 0 :(得分:5)
您可以使用AVAssetImageGenerator
执行此操作。粗糙的代码,从工作项目中复制和粘贴(但可能没有被正确隔离):
_thumbnailView
是显示缩略图的UIImageView
。 _activityView
是UIActivityIndicatorView
,在缩略图完成加载时会隐藏。
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作为参数的原因,因此我们在视频中避免这种情况。