我无法从电影中提取缩略图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!?");
}];
}