ijkplayer 断线重连问题

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

给你找了好久,找到的博文,你看看
如有帮助,请采纳,谢谢