关于RTSPServer作为服务的阻塞问题/关闭问题以及建议
大佬,最近在用librtsp做server端时,我们选择的异步模式: `void RTSPServer::StartRTSPServer1() { // tcp 异步 aio_worker_init(N_AIO_THREAD);
struct aio_rtsp_handler_t handler;
memset(&handler, 0, sizeof(handler));
handler.base.ondescribe = rtsp_ondescribe;
handler.base.onsetup = rtsp_onsetup;
handler.base.onplay = rtsp_onplay;
// handler.base.onpause = rtsp_onpause;
handler.base.onteardown = rtsp_onteardown;
// handler.base.close = rtsp_onclose;
// handler.base.onannounce = rtsp_onannounce;
// handler.base.onrecord = rtsp_onrecord;
handler.base.onoptions = rtsp_onoptions;
handler.base.ongetparameter = rtsp_ongetparameter;
handler.base.onsetparameter = rtsp_onsetparameter;
// handler.base.send; // ignore handler.onerror = rtsp_onerror;
// // 1. check s_workdir, MUST be end with '/' or '\'
// // 2. url: rtsp://127.0.0.1:8554/vod/
int rtsp_port = CConfig::GetInstance()->GetIntDefault("RTSPPort",554);
void* tcp = rtsp_server_listen("0.0.0.0", rtsp_port, &handler, this);
// //assert(tcp); // rtsp_transport_udp_create("0.0.0.0", 8554, &handler.base, this); } `
为了解决网络穿透的问题,我们使用的都是tcp的传输模式.
但是在使用的过程中,想请教下老大:
1.读的时候确实走了aio,通过监听可读,实现了异步对数据的读取,但是写的时候是一个阻塞的操作,
这里有一个建议 : 由于控制链路和视频链路用的是同一个,建议控制链路走不丢包模式,保证数据必须发出去,视频链路则允许丢包,再检测到网络阻塞后,新进来的rtp包直接进行丢弃.
2.关于RTSP服务端主动断开连接的问题 : 有些业务场景是对数据码流转为RTSP,转发,经常会出现数据源头断开了,这个时候服务端就需要主动的关闭连接,这里只发现了一个: rtsp_server_destroy 但是这个接口一调用就会崩溃.(core文件忘记截图),是在一个aio_work里面崩溃的. 请教下,如何在服务端主动关闭和client的rtsp连接
这个例子比较简单,回头更新个rtsp实现完全异步aio的例子。