捕获 IJKMPMovieLoadStateStalled通知;例如,
- (void)didLoadingStateChange:(NSNotification*)notification
{
if (self.loadingStateHandler) {
IJKMPMovieLoadState loadState = self.mediaPlayer.loadState;
if ((loadState & IJKMPMovieLoadStatePlaythroughOK) != 0) {
self.loadingStateHandler(GCLivePlayerLoadingStatePlayThrough);
}
else if ((loadState & IJKMPMovieLoadStateStalled) != 0) {
self.loadingStateHandler(GCLivePlayerLoadingStateStalled);
[self startRecoveryTimer];
}
else if ((loadState & IJKMPMovieLoadStatePlayable) != 0) {
self.loadingStateHandler(GCLivePlayerLoadingStatePlayable);
}
else {
self.loadingStateHandler(GCLivePlayerLoadingStateUnknown);
}
}
}
启动重试并恢复的定时器;例如,每2秒重试一次。
- (void)startRecoveryTimer
{
self.recoveryPeriodic = [NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(recoveryTimerFired) userInfo:nil repeats:YES];
}
在定时器的回调中重新初始化与 cdn 的连接;
- (void)recoveryTimerFired
{
NSLog(@"Recovery timer fired");
[self.mediaPlayer stop];
[self removeMediaPlayerObservers];
[self.mediaPlayer.view removeFromSuperview];
// [self.mediaPlayer shutdown];
[self setMediaPlayer:nil];
NSLog(@"Recovery timer fired: stop");
IJKFFOptions *options = [IJKFFOptions optionsByDefault];
self.mediaPlayer = [[IJKFFMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:self.assetUrl] withOptions:options];
[self.mediaPlayer.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
[self.mediaPlayer.view setFrame:self.playerView.bounds];
[self.mediaPlayer setScalingMode:IJKMPMovieScalingModeAspectFill];
[self.mediaPlayer setShouldAutoplay:self.shouldAutoPlay];
[self.mediaPlayer.view setBackgroundColor:[UIColor clearColor]];
[self.playerView addSubview:self.mediaPlayer.view];
[self.mediaPlayer prepareToPlay];
[self addMediaPlayerObservers];
NSLog(@"Recovery timer fired: play");
}