我用这个作为参考:Getting thumbnail from a video url or data in iPhone SDK
该方法使用 MPMoviePlayerController 类而不是 AVFoundation,我想我也想使用它,因为人们说 MPMoviePlayer 方式比 AVFoundation 方式快。
问题是,用于创建缩略图的方法[player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame]
在 iOS 7.0 中已被弃用。
通过查看苹果文档,其余支持的创建缩略图的方法是通过方法(void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option
和(void)cancelAllThumbnailImageRequests
. 但是,正如方法签名所指示的那样,这些方法什么也不返回。那么如何访问UIImage
这些方法创建的缩略图呢?
如果它有帮助,这就是我迄今为止在代码方面所拥有的:
self.videoURL = info[UIImagePickerControllerMediaURL];
NSData *videoData = [NSData dataWithContentsOfURL:self.videoURL];
//Create thumbnail image
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:self.videoURL];
[player requestThumbnailImagesAtTimes:@[@1] timeOption:MPMovieTimeOptionNearestKeyFrame];
//UIImage *thumbnail = ???
如何获得对缩略图的 UIImage 引用?
编辑 我想出了如何为缩略图请求创建通知(使用这个问题作为参考)。但是,我意识到此方法与主线程异步工作,因此我的通知处理程序方法似乎从未被调用过。
这就是我现在所拥有的。
self.videoURL = info[UIImagePickerControllerMediaURL];
NSData *videoData = [NSData dataWithContentsOfURL:self.videoURL];
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:self.videoURL];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleThumbnailImageRequestFinishNotification:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:player];
[player requestThumbnailImagesAtTimes:@[@1] timeOption:MPMovieTimeOptionNearestKeyFrame];
然后我的处理程序方法:
-(void)handleThumbnailImageRequestFinishNotification:(NSNotification*)notification
{
NSDictionary *userinfo = [notification userInfo];
NSError* value = [userinfo objectForKey:MPMoviePlayerThumbnailErrorKey];
if (value != nil)
{
NSLog(@"Error creating video thumbnail image. Details: %@", [value debugDescription]);
}
else
{
UIImage *thumbnail = [userinfo valueForKey:MPMoviePlayerThumbnailImageKey];
}
但是处理程序永远不会被调用(或者看起来如此)。