停止 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的代码。
相关文章:
- 为多个会话保留XPtr
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 如何修复 Onnx运行时会话>运行问题?
- 为什么 KMS drmModeSetCrtc() 在 X11 会话中运行时会失败并被拒绝权限?
- 如何在带有 gdb GUI 前端的 ARM gdbserver 的 PC 上执行远程 gdb 会话?
- 宽藤会话更新无休止循环
- Windows桌面程序保存您的计算机会话 - 基于程序崩溃时的恢复会话
- 在Win7上,在默认端点上轮询音频会话有时会崩溃
- 自动测试不会显示在会话前端中。虚幻引擎
- CSActiveMQ CPP 生产者 - 一个会话可以使用多个队列吗?
- Tensorflow C++关闭会话后不释放 GPU 资源
- 在没有外部文件的情况下在应用会话之间保存变量
- 有没有办法在 C 或 C++ 中嵌入 Sh/Bash 会话?
- 与 Python 中子进程中的另一个应用程序的交互式会话
- 如何使用live555提取H264帧
- Tensorflow C++ 代码 SessionFactory::GetFactory 如何选择使用哪个会话?直接会话
- Live555 WebRtc integration
- Libssh2:在"每个线程的通道"基础上在线程之间共享 ssh 会话是否安全?
- 如何处理Qt托盘应用程序中的会话更改通知
- 停止 Live555 重复使用会话