2017-10-18 64 views
0

我使用Live555从远程连接上的IP摄像头提取数据。有时会有短暂的中断(这可能是网络QOS问题),但是,每次发生这种情况而不是成功地重新启动连接时,live555都会死亡。调试输出是这样的:停止Live555重新使用会话

Closing session, because we stopped receiving packets.itrate=N/A speed=1.37x 
Created new TCP socket 3 for connection 
Connecting to 10.8.1.14, port 10111 on socket 3... 
...remote connection opened 
Sending request: PLAY rtsp://mycamera.test/live/ch0/ RTSP/1.0 
CSeq: 6 
User-Agent: /bin/openRTSP (LIVE555 Streaming Media v2017.07.18) 
Session: 1487641045855494467 
Range: npt=0.000- 

Received 199 new bytes of response data. 
Received a complete PLAY response: 
RTSP/1.0 500 Internal Server Error 
Server: DSS/6.0.3 (Build/526.3; Platform/Linux; Release/Darwin Streaming Server; State/Development;) 
Cseq: 6 
Session: 1487641045855494467 
Connection: Close 

Failed to start playing session: 500 Internal Server Error 
Created new TCP socket 3 for connection 
Connecting to 10.8.1.14, port 10111 on socket 3... 
...remote connection opened 
Sending request: TEARDOWN rtsp://mycamera.test/live/ch0/ RTSP/1.0 
CSeq: 7 
User-Agent: /bin/openRTSP (LIVE555 Streaming Media v2017.07.18) 
Session: 1487641045855494467 

Received 180 new bytes of response data. 
Received a complete TEARDOWN response: 
RTSP/1.0 200 OK 
Server: DSS/6.0.3 (Build/526.3; Platform/Linux; Release/Darwin Streaming Server; State/Development;) 
Cseq: 7 
Session: 1487641045855494467 
Connection: Close 

这似乎是live555是原因捞出是因为相机试图重新启动流为现有会话时抛出一个500错误。既然开始一个新的会话有效,有没有什么办法可以告诉live555放弃现有的会话并重新开始,而不是放弃?我有一个cron作业,可以检测live555何时停止并重新启动它,但是当我这样做时会出现问题,因此如果我能够说服live555来弥补相机固件中的错误,它会更加干净。

我很高兴修补live555代码,并在必要时重建!

回答

0

如果你看的playCommon.cpp代码,你可以看到

void sessionAfterPlaying(void* /*clientData*/) { 
    if (!playContinuously) { 
    shutdown(0); 
    } else { 
    // We've been asked to play the stream(s) over again. 
    // First, reset state from the current session: 
    if (env != NULL) { 
     env->taskScheduler().unscheduleDelayedTask(periodicFileOutputTask); 
     env->taskScheduler().unscheduleDelayedTask(sessionTimerTask); 
     env->taskScheduler().unscheduleDelayedTask(arrivalCheckTimerTask); 
     env->taskScheduler().unscheduleDelayedTask(interPacketGapCheckTimerTask); 
     env->taskScheduler().unscheduleDelayedTask(qosMeasurementTimerTask); 
    } 
    totNumPacketsReceived = ~0; 

    startPlayingSession(session, initialSeekTime, endTime, scale, continueAfterPLAY); 
    } 
} 

,正如你在日志中看到,它发送播放和亘古不变的重新发起会话。 为了改变这种行为,你需要修改openRTSP的代码。