直到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];
然后继续使用此缩略图作为按钮图像作为预览....但它不起作用。
如果您从我的编码中看到我出错了,您的帮助将再次受到赞赏。干杯
答案 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)
}