thumbnailImageAtTime:现已弃用 - 有什么替代方案?

时间:2013-09-30 23:48:23

标签: image video ios7 deprecated nsnotificationcenter

直到iOS7更新我才使用...

UIImage *image = [moviePlayer thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];

...取得了巨大成功,因此我的应用可以显示用户刚拍摄的视频。

我理解这种方法,因为iOS7现已弃用,我需要另一种选择。

我认为有一种方法
- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option

虽然如何从中返回图像,以便将其放在videoReview按钮图像中?

先谢谢你,Jim。

****编辑通知中心方法后编辑问题***

我使用了以下代码 -

[moviePlayer requestThumbnailImagesAtTimes:times timeOption:MPMovieTimeOptionNearestKeyFrame];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerThumbnailImageRequestDidFinishNotification::) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:moviePlayer];

我制作了两个NSNumber对象的NSArray时间1& 2.

然后我尝试使用以下方法捕获通知

-(void)MPMoviePlayerThumbnailImageRequestDidFinishNotification: (NSDictionary*)info{

UIImage *image = [info objectForKey:MPMoviePlayerThumbnailImageKey];

然后继续使用此缩略图作为按钮图像作为预览....但它不起作用。

如果您从我的编码中看到我出错了,您的帮助将再次受到赞赏。干杯

7 个答案:

答案 0 :(得分:41)

使用AVAssetImageGenerator管理以找到一个好方法,请参阅下面的代码......

AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:partOneUrl options:nil];
AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1];
generate1.appliesPreferredTrackTransform = YES;
NSError *err = NULL;
CMTime time = CMTimeMake(1, 2);
CGImageRef oneRef = [generate1 copyCGImageAtTime:time actualTime:NULL error:&err];
UIImage *one = [[UIImage alloc] initWithCGImage:oneRef];
[_firstImage setImage:one];
_firstImage.contentMode = UIViewContentModeScaleAspectFit;

在头文件中,请导入

#import <AVFoundation/AVFoundation.h>

它完美无缺,我已经能够从viewDidLoad调用它,这比从viewDidAppear调用弃用的thumbNailImageAtTime更快。

希望这可以帮助其他遇到同样问题的人。

答案 1 :(得分:5)

requestThumbnailImagesAtTimes:timeOption:方法将在图像请求完成时发布MPMoviePlayerThumbnailImageRequestDidFinishNotification notification。需要缩略图的代码应为subscribe to this notification using NSNotificationCenter,并在收到通知时使用该图像。

答案 2 :(得分:2)

这样做的方法,至少在iOS7中是使用浮动的

NSNumber *timeStamp = @1.f;
[moviePlayer requestThumbnailImagesAtTimes:timeStamp timeOption:MPMovieTimeOptionNearestKeyFrame];

希望这有帮助

答案 3 :(得分:2)

Jeely提供了一个很好的解决方法,但是当MPMoviePlayer已经为此任务提供功能时,它需要一个额外的库。我注意到原始海报代码中存在语法错误。缩略图通知处理程序需要NSNotification类型的对象,而不是字典对象。这是一个更正的例子:

-(void)MPMoviePlayerThumbnailImageRequestDidFinishNotification: (NSNotification*)note
{
    NSDictionary * userInfo = [note userInfo];
    UIImage *image = (UIImage *)[userInfo objectForKey:MPMoviePlayerThumbnailImageKey];
    if(image!=NULL)
        [thumbView setImage:image];
}

答案 4 :(得分:2)

问题是您必须在requestThumbnailImagesAtTimes中指定浮点值。

例如,可以使用

[self.moviePlayer requestThumbnailImagesAtTimes:@[@14.f] timeOption:MPMovieTimeOptionNearestKeyFrame];

无法使用

[self.moviePlayer requestThumbnailImagesAtTimes:@[@14] timeOption:MPMovieTimeOptionNearestKeyFrame];

答案 5 :(得分:0)

我自己只是为这个问题寻找解决方案,并从你的问题中得到了很好的帮助。 上面的代码使用了一个小的更改,删除了冒号......

更改

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerThumbnailImageRequestDidFinishNotification::) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:moviePlayer];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerThumbnailImageRequestDidFinishNotification:) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:moviePlayer];

让这个很好地工作。此外,我发现如果您已经在通知选择器中,则无法调用依赖NotificationCenter的方法。我最初尝试过的东西 - 我尝试在requestThumbnailImagesAtTimes的通知选择器中调用MPMoviePlayerPlaybackDidFinishNotification - 这些东西不会起作用。我认为因为通知不会被解雇。

答案 6 :(得分:0)

Swift 2.1中的代码如下所示:

do{
    let asset1 =  AVURLAsset(URL: url)
    let generate1: AVAssetImageGenerator = AVAssetImageGenerator(asset: asset1)
    generate1.appliesPreferredTrackTransform = true

    let time: CMTime = CMTimeMake(3, 1)  //TO CATCH THE THIRD SECOND OF THE VIDEO
    let oneRef: CGImageRef = try generate1.copyCGImageAtTime(time, actualTime: nil)
    let resultImage = UIImage(CGImage: oneRef)
}
catch let error as NSError{
    print(error)
}