Can not seek with MPMoviePlayerController
-
27-10-2019 - |
Question
I am going to seek timeline on MPMediaPlayerController.
I tried with the undocumented method setCurrentTime of MPMediaPlayerController as follows.
[player setCurrentTime:1.f];
Then the apple crashs with follows...
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MPMoviePlayerController setCurrentTime:]: unrecognized selector sent to instance 0x5619fe0'
*** Call stack at first throw:
(
0 CoreFoundation 0x00f59be9 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x010ae5c2 objc_exception_throw + 47
2 CoreFoundation 0x00f5b6fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3 CoreFoundation 0x00ecb366 ___forwarding___ + 966
4 CoreFoundation 0x00ecaf22 _CF_forwarding_prep_0 + 50
5 MPlayerExample 0x0000227d -[MPlayerExampleViewController PauseVideo] + 69
6 Foundation 0x000367f6 __NSFireDelayedPerform + 441
7 CoreFoundation 0x00f3afe3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
8 CoreFoundation 0x00f3c594 __CFRunLoopDoTimer + 1220
9 CoreFoundation 0x00e98cc9 __CFRunLoopRun + 1817
10 CoreFoundation 0x00e98240 CFRunLoopRunSpecific + 208
11 CoreFoundation 0x00e98161 CFRunLoopRunInMode + 97
12 GraphicsServices 0x0188e268 GSEventRunModal + 217
13 GraphicsServices 0x0188e32d GSEventRun + 115
14 UIKit 0x002c642e UIApplicationMain + 1160
15 MPlayerExample 0x00001fe4 main + 102
16 MPlayerExample 0x00001f75 start + 53
)
terminate called after throwing an instance of 'NSException'
Solution
You can seek MPMoviePlayerController
using the currentPlaybackTime
property, which is documented in the MPMediaPlayback Protocol Reference.
So your code would look like:
[player setCurrentPlaybackTime:1.0];
OTHER TIPS
It's an undocumented API...it's not guaranteed to work. In fact, you shouldn't expect it to. It's entirely possible Apple removed it from a OS update, and now the method doesn't exist.
If it matters, you're passing it a float, and I think it expects a double. That might be why you're having problems. But if you're writing an app for distribution on the app store there's no point investigating further - your app will get rejected. Apple statically analyse code automatically upon submission, any use of non public APIs will result in your app getting bounced straight back to you.
here is a code which will work for seeking a video in MPMoviePlayer using custom slider
//create slider
slider1 = [[UISlider alloc] initWithFrame:CGRectMake(85, 435, 150,30)];
[slider1 addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
[slider1 setBackgroundColor:[UIColor clearColor]];
slider1.minimumValue = 0;
slider1.continuous = YES;
[self.view addSubview:slider1];
// Set slider max value as moviePlayerController Total Duration and Current (Set Value ) as slider Value
-(void)sliderAction:(id)sender
{
UISlider *slider = (UISlider*)sender;
float value = slider.value;
slider.maximumValue = self.moviePlayerController.duration;
self.moviePlayerController.currentPlaybackTime = value;
}