我无法使用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];
// ...
}
@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!?");
}];
}
答案 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?