22

直到 iOS7 更新我使用...

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

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

我理解这种方法,因为 iOS7 现在已弃用,我需要一种替代方法。我看到有一种方法

- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option

尽管如何从中返回图像,以便可以将其放置在 videoReview 按钮图像中?

提前感谢,吉姆。

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

我使用了以下代码 -

[moviePlayer requestThumbnailImagesAtTimes:times timeOption:MPMovieTimeOptionNearestKeyFrame];

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

我制作了两个 NSNumber 对象 1 和 2 的 NSArray 时间。

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

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

UIImage *image = [info objectForKey:MPMoviePlayerThumbnailImageKey];

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

如果您可以从我的编码中看到我出错的地方,我们将再次感谢您的帮助。干杯

4

7 回答 7

42

Managed to find a great way using AVAssetImageGenerator, please see code below...

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;

Within header file, please import

#import <AVFoundation/AVFoundation.h>

It works perfect and I've been able to call it from viewDidLoad, which was quicker than calling the deprecated thumbNailImageAtTime: from the viewDidAppear.

Hope this helps anyone else who had the same problem.

* **Update for Swift 5.1 ****

Useful function...

    func createThumbnailOfVideoUrl(url: URL) -> UIImage? {
        let asset = AVAsset(url: url)
        let assetImgGenerate = AVAssetImageGenerator(asset: asset)
        assetImgGenerate.appliesPreferredTrackTransform = true

        let time = CMTimeMakeWithSeconds(1.0, preferredTimescale: 600)
        do {
            let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil) 
            let thumbnail = UIImage(cgImage: img)
            return thumbnail
        } catch {
          print(error.localizedDescription)
          return nil
        }
    }
于 2013-10-01T21:21:15.973 回答
5

requestThumbnailImagesAtTimes:timeOption: 方法将在图像请求完成时发布MPMoviePlayerThumbnailImageRequestDidFinishNotification通知。您需要缩略图图像的代码应使用 订阅此通知NSNotificationCenter,并在收到通知时使用该图像。

于 2013-10-01T00:11:13.747 回答
2

问题是您必须在requestThumbnailImagesAtTimes.

例如,这将起作用

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

但这不起作用

[self.moviePlayer requestThumbnailImagesAtTimes:@[@14] timeOption:MPMovieTimeOptionNearestKeyFrame];
于 2014-05-27T11:35:23.720 回答
2

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

-(void)MPMoviePlayerThumbnailImageRequestDidFinishNotification: (NSNotification*)note
{
    NSDictionary * userInfo = [note userInfo];
    UIImage *image = (UIImage *)[userInfo objectForKey:MPMoviePlayerThumbnailImageKey];
    if(image!=NULL)
        [thumbView setImage:image];
}
于 2014-04-19T04:29:05.833 回答
2

做到这一点的方法,至少在 iOS7 中是为你的时代使用浮点数

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

希望这可以帮助

于 2014-04-02T05:59:47.180 回答
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- 一些不起作用的东西。我想是因为通知不会触发。

于 2014-02-28T00:01:01.543 回答
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)
}
于 2016-03-22T16:06:33.993 回答