ZLmediakit的RTSP流交互流程
以下流程包括接收RTSP推流,和ZLM作为代理拉流的流程
其中,接收推流中的TCP传输数据和UDP传输数据有一定的差异(红色是TCP数据传输。紫色是UDP数据传输);tcpserver是RTSP协议交互使用的
其中:UDP的(数据传输)socket是在RTSPsession中创建的,依据SETUP中的transport参数解析
TCP的(数据传输socket)与RTSP协商socket是同一个;但是与554端口监听的socket不是同一个:
554端口监听socket是在tcpserver类中的 Socket::Ptr _socket;成员;代码如下
bool Socket::listen(uint16_t port, const string &local_ip, int backlog) { closeSock(); int fd = SockUtil::listen(port, local_ip.data(), backlog); //fd=603 if (fd == -1) { return false; } return fromSock_l(std::make_shared<SockNum>(fd, SockNum::Sock_TCP_Server)); }
RTSP over tcp交互中的数据交互(和TCP协议交互,和UDP协议交互),使用的是新的socket;与端口监听使用的不是一个socket;
Socket::Ptr peer_sock; auto sock = std::make_shared<SockNum>(fd, SockNum::Sock_TCP); //fd = 704
用这个理解会好一点:一个是监听fd,一个是链接fd; connect_fd =accept(listen_fd,(structsockaddr *)&peer_addr,&addr_len);