MediaPlayer -requestThumbnailImagesAtTimes未触发通知

时间:2014-07-31 16:26:49

标签: ios objective-c ios7 mpmediaplayercontroller

我无法使用MPMoviePlayerController

从电影中提取缩略图

-requestThumbnailImagesAtTimes: timeOption:

我99%确定我已经正确设置了一切;我根本没有收到这些通知。

我最初在ReactiveCocoa工作;为了缩小可能性,我已经得到了一个没有它的最小破坏的例子。

最小破坏的例子:

@import MediaPlayer;

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
  // 1. register the observer before requesting the thumbnails
  [[NSNotificationCenter defaultCenter] addObserverForName:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
    // 4. this never gets hit
    NSLog(@"%@", note.name);
  }];

  // 2. this works fine - media url is correct etc
  MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[info objectForKey:UIImagePickerControllerMediaURL]];

  // 3. previously was using integers instead of floats; fixed that but this still doesn't do anything
  [moviePlayer requestThumbnailImagesAtTimes:@[ @0.0f, @1.0f ] timeOption:MPMovieTimeOptionExact];
  // ...
}

ReactiveCocoa中的原始示例

@import MediaPlayer;

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
  // 1. set the file URL
  self.viewModel.movieURL = [info objectForKey:UIImagePickerControllerMediaURL];
  // ...
}

// in viewmodel

- (void)viewDidLoad {
  RACSignal *moviePlayerSignal = [[RACObserve(self, movieURL) ignore:nil] map:^id(NSURL *url) {
    // 2. this allocates correctly
    return [[MPMoviePlayerController alloc] initWithContentURL:url];
  }];

  // 3. observe the moviePlayerSignal; 
  [[[moviePlayerSignal map:^id(MPMoviePlayerController *player) {
    @strongify(self);
    NSLog(@"%@", player); // checking that the player exists etc - it does; all good here.

    // register the observer before we request the thumbnail
    RACSignal *notification = [[[NSNotificationCenter defaultCenter] rac_addObserverForName:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:player] takeUntil:[self rac_willDeallocSignal]];

    // request the thumbnail
    [player requestThumbnailImagesAtTimes:@[ @0.0f ] timeOption:MPMovieTimeOptionExact];

    // map the signal into a stream of signals on the observer
    return notification;

    // if we subscribeNext without flattening we correctly get back RACSignals every time 
  }] flatten] subscribeNext:^(id x) {
    // the flattened signal never gets a next because the player isn't firing notifications :(
    NSLog(@"WHY DOESN'T THIS WORK!?");
  }];
}

3 个答案:

答案 0 :(得分:1)

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didReceiveImage:)
                                             name:MPMoviePlayerThumbnailImageRequestDidFinishNotification
                                           object:self.player];

查看通知的对象。 您需要将其设置为MPMoviePlayerController。 所以它必须在MPMoviePlayerController的初始化之后写入。

答案 1 :(得分:0)

您可能只需要稍微不同地设置通知(及更早版本)。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(mySelector)
                                                 name:MPMoviePlayerThumbnailImageRequestDidFinishNotification
                                               object:self.player];
}

-(void)mySelector {
    NSLog(@"Booya");
}

答案 2 :(得分:0)

最初,(在thumbnailImageAtTime:不赞成之后)我也有问题让requestThumbnailImagesAtTimes: timeOption:正常启动,但我发现通过AVAssetImageGenerator从视频创建缩略图的有效方法。从那以后我就一直使用这种方式,如果它有帮助,请随意使用它作为替代方案。

请参阅我之前回答的链接以了解如何使用它。

thumbnailImageAtTime: now deprecated - What's the alternative?