RTSP/RTP和live555通信详解,搭建流媒体服务器
[复制链接]
本帖最后由 37°男人 于 2014-1-19 11:03 编辑
1、从下图可以发现,rtsp是基于tcp可靠连接,而rtp是基于udp不可靠连接,所以在创建网络socket的时候需要分别经行创建。
2、创建rtsp网络连接 sfd = socket(AF_INET, SOCK_STREAM, 0); bind(sfd, (struct sockaddr*)&addr, sizeof(addr)); listen(sfd, 10); clifd = accept(sfd, (struct sockaddr*)&addr, &addrlen); 等待live555发送rtsp报文协议(请求)
3、对rtsp报文OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUS,GET_PARAMETER, SET_PARAMETER经行解析 解析出对应的报文,经行分析处理 if(strncmp(array[0],"OPTIONS",7) == 0) { printf("xubinbin line:%d;\n",__LINE__); send(clifd, str_options, strlen(str_options), 0); } else if(strncmp(array[0],"DESCRIBE",8) == 0) { printf("xubinbin line:%d;\n",__LINE__); send(clifd, str_describe, strlen(str_describe), 0); } else if(strncmp(array[0],"SETUP",5) == 0)
4、sdp协议处理 在rtsp报文describe请求后,要求获取音视频的基本信息 服务器的应答信息 "Content-type: application/sdp\r\n" "Content-length: 392\r\n" 的后面就是跟392字节的sdp信息(具体查看sdp协议)
5、网络端口的设置(设置rtp通信端口) 这一步非常的重要,端口错了就没有办法通信了,在rtsp报文setup中 客户端(live555)发送setup报文,报文中包括了rtp中通信的客户端的端口号 服务器的应答信息中,应当把客户端和服务器的端口号都告诉客户端 client_port=%d-%d;server_port=6970-6971\r\n (附:这里的通信模式和飞鸽传书的协议有点类似,命令和数据分开分别发送)
6、数据的发送 在收到rtsp报文paly请求,发送rtsp应当信息后就可以直接给客户端发送rtp数据了 else if(strncmp(array[0],"PLAY",4) == 0) { printf("xubinbin line:%d;\n",__LINE__); send(clifd, str_play, strlen(str_play), 0); //创建rtp处理线程,用udp发送数据 pthread_create(&tid_udp,NULL,(void *)udp_process,(void *)NULL); //udp获取信息 } 单独创建一个线程来发送rtp数据,这样可以同时响应多路请求
7、发送rtp数据 在发送rtp数据的时候要设置rtp信息头12字节,后面再跟音视频数据。
8、网络抓包信息
9、live555收看音视频数据流
10、终端打印信息 root@embeded-server:/home/xbb/test/live555/rtsp/1_rtsp_test# ./target listenning.... ############################### connected from: 192.168.1.254 CSeq: 2 User-Agent: LibVLC/2.0.8 (LIVE555 Streaming Media v2012.12.18) array = *CSeq: 2* array = *User-Agent: LibVLC/2.0.8 (LIVE555 Streaming Media v2012.12.18)* array = *(null)* xubinbin line:211; xubinbin line:216; time:*Sat Jan 18 03:49:43 2014 *; xubinbin line:275; ############################### connected from: 192.168.1.254 CSeq: 3 User-Agent: LibVLC/2.0.8 (LIVE555 Streaming Media v2012.12.18) Accept: application/sdp array = *CSeq: 3* array = *User-Agent: LibVLC/2.0.8 (LIVE555 Streaming Media v2012.12.18)* array = *Accept: application/sdp* array = *(null)* xubinbin line:211; xubinbin line:221; time:*Sat Jan 18 03:49:43 2014 *; xubinbin line:275; ############################### connected from: 192.168.1.254 CSeq: 4 User-Agent: LibVLC/2.0.8 (LIVE555 Streaming Media v2012.12.18) Transport: RTP/AVP;unicast;client_port=64706-64707 array = *CSeq: 4* array = *User-Agent: LibVLC/2.0.8 (LIVE555 Streaming Media v2012.12.18)* array = *Transport: RTP/AVP;unicast;client_port=64706-64707* array = *(null)* xubinbin line:211; xubinbin line:226; client_port_buf = *=64706-64707* rtp_cli_port = *64706* time:*Sat Jan 18 03:49:43 2014 *; xubinbin line:275; ############################### connected from: 192.168.1.254 CSeq: 5 User-Agent: LibVLC/2.0.8 (LIVE555 Streaming Media v2012.12.18) Session: 755163C8 Range: npt=0.000- array = *CSeq: 5* array = *User-Agent: LibVLC/2.0.8 (LIVE555 Streaming Media v2012.12.18)* array = *Session: 755163C8* array = *Range: npt=0.000-* array = *(null)* xubinbin line:211; xubinbin line:246; time:*Sat Jan 18 03:49:43 2014 *; xubinbin line:275; ############################### connected from: 192.168.1.254 11、源码编译、下载(附件下载源码) gcc server.c -o target -lpthread
|