簡體   English   中英

停止Live555重用會話

[英]Stop Live555 from re-using session

我正在使用Live555從遠程連接上的IP網絡攝像頭提取數據。 流有時會短暫中斷(這可能是網絡QOS問題),但是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代碼並在必要時進行重建!

如果查看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);
  }
}

如您在日志中所看到的,它發送PLAY,並且不會重新啟動會話。 為了更改此行為,您需要修改openRTSP的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM