Android端使用 ijkplayer 0.8.8 他们官网的Demo播放 RTMP 断网后无法重连。有人知道怎么才能断网后重连上吗?
1. IOS源码断网之后是可以重连上的。库中做了处理,和安卓同一套c库
2. 安卓端尝试过网络重连上之后,再次打开一次播放器。但是这种方式太生硬。
3. 有没有趟过坑的 或者知道为啥安卓不能自动(ijk库中处理)重连上的吗?
首先留下完美解决方案的,有红包
断网自动重新连接
url前接上ijkhttphook:,如
String url = "ijkhttphook:http://baobab.wdjcdn.com/14564977406580.mp4";
然后设置
((IjkMediaPlayer)mediaPlayer).setOnNativeInvokeListener(new IjkMediaPlayer.OnNativeInvokeListener() {
@Override
public boolean onNativeInvoke(int i, Bundle bundle) {
return true;
}
})
问题起因:
在进行ijkplayer播放器的测试时,发现ijkplayer播放器在切换网络时出现直播画面停止的问题。
问题分析:
抓取日志发现:tv.danmaku.ijk.media.player.IjkMediaPlayer: Error (-10000,0)
问题解决:
重写OnErrorListener的onError方法,然后判断what = -10000的时候,触发重置播放器的操作
参考内容
ijkplayer_android_def.h :
// Generic error codes for the media player framework. Errors are fatal, the
// playback must abort.
//
// Errors are communicated back to the client using the
// MediaPlayerListener::notify method defined below.
// In this situation, 'notify' is invoked with the following:
// 'msg' is set to MEDIA_ERROR.
// 'ext1' should be a value from the enum media_error_type.
// 'ext2' contains an implementation dependant error code to provide
// more details. Should default to 0 when not used.
//
// The codes are distributed as follow:
// 0xx: Reserved
// 1xx: Android Player errors. Something went wrong inside the MediaPlayer.
// 2xx: Media errors (e.g Codec not supported). There is a problem with the
// media itself.
// 3xx: Runtime errors. Some extraordinary condition arose making the playback
// impossible.
//
enum media_error_type {
// 0xx
MEDIA_ERROR_UNKNOWN = 1,
// 1xx
MEDIA_ERROR_SERVER_DIED = 100,
// 2xx
MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200,
// 3xx
// -xx
MEDIA_ERROR_IO = -1004,
MEDIA_ERROR_MALFORMED = -1007,
MEDIA_ERROR_UNSUPPORTED = -1010,
MEDIA_ERROR_TIMED_OUT = -110,
MEDIA_ERROR_IJK_PLAYER = -10000,
};
循环播放是支持的,之前设置有问题😂,断网重连 对 mp4也是可以的,flv 的就不支持了,目前想到的是网络可用时重新初始化播放器然后播放来解决。
断网自动重新连接
url前接上ijkhttphook:,如
String url = "ijkhttphook:http://baobab.wdjcdn.com/14564977406580.mp4";
然后设置
((IjkMediaPlayer)mediaPlayer).setOnNativeInvokeListener(new IjkMediaPlayer.OnNativeInvokeListener() {
@Override
public boolean onNativeInvoke(int i, Bundle bundle) {
return true;
}
})
我在使用IJKFFMoviePlayerController播放器的时候遇到一个问题,播放器拉流播放直播的时候,从wifi转到4g网络,过不了多久,就会发一个 IJKMPMoviePlayerPlaybackDidFinishNotification 的通知提示网络中断了,中断原因是IJKMPMovieFinishReasonPlaybackError,然后我尝试播放器停止再重新播放,会直接崩溃,我想问一下有人知道正确的重新播放的操作吗?我的是直接 [self.player stop];
[self.player prepareToPlay];
[self.player play];
捕获 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");
}
https://www.cnblogs.com/woaixingxing/p/7070024.html
给你找了好久,找到的博文,你看看
如有帮助,请采纳,谢谢