一、问题场景
当接入记录仪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秒,可根据播放器实际销毁时间,自行调整。