RTSP老化异常解决方案

一、问题场景

当接入记录仪rtsp流,长时间老化时,由于网络等原因,造成断流,此时需要app端主动重连。如果多次重连,会导致机器异常。

二、APP端解决方案

当rtsp断流时,播放器收到停止播放回调,此时teardown当前连接,即销毁当前播放器(这一步是重点),然后新建播放器拉流

三、代码示例:

以VLC播放器为例

//VCL播放状态回调
- (void)mediaPlayerStateChanged:(NSNotification *)aNotification
{
    int aaa = (int)self.vlcPlayer.state;
    switch (aaa) {
        case VLCMediaPlayerStateStopped:
                   
            break;
        case VLCMediaPlayerStateOpening:
                     break;
        case VLCMediaPlayerStateBuffering:
                      break;
        case VLCMediaPlayerStateEnded:  // 检测到播放器老化断流
        {       //销毁播放器
             [self deallocVLC];
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                     //播放器销毁后,重新开启播放器
                    [self startVlCPlayNeedStop:NO];


            });
}
//销毁播放器
-(void)deallocVLC
{
    if (self.vlcPlayer) {
        

        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            if ( self.vlcPlayer.isPlaying  ) {
                
                
                [self.vlcPlayer stop];
            }
            
            self.vlcPlayer = [[VLCMediaPlayer alloc]init];
            
            self.vlcPlayer.delegate = nil;
            
            self.vlcPlayer.drawable = nil;
            
            self.vlcPlayer.media = nil;
            
            self.vlcPlayer = nil;
            
        });
    }
   
}

四、其他

上诉代码只适用于VLC,其他播放器处理原理相同,即断流重连时,先teardown当前连接,然后重新拉流。 其中断连后延迟2秒,可根据播放器实际销毁时间,自行调整。

你可能感兴趣的:(RTSP老化异常解决方案)