live555——RTSP/RTP和live555通信詳解,搭建流媒體服務器

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
recv:OPTIONS rtsp://192.168.1.44:8554/123445 RTSP/1.0
CSeq: 2
User-Agent: LibVLC/2.0.8 (LIVE555 Streaming Media v2012.12.18)
array = *OPTIONS rtsp://192.168.1.44:8554/123445 RTSP/1.0*
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
recv:DESCRIBE rtsp://192.168.1.44:8554/123445 RTSP/1.0
CSeq: 3
User-Agent: LibVLC/2.0.8 (LIVE555 Streaming Media v2012.12.18)
Accept: application/sdp
array = *DESCRIBE rtsp://192.168.1.44:8554/123445 RTSP/1.0*
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 = *SETUP rtsp://192.168.1.44:8554/123445/track1 RTSP/1.0*
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
recv:PLAY rtsp://192.168.1.44:8554/123445 RTSP/1.0
CSeq: 5
User-Agent: LibVLC/2.0.8 (LIVE555 Streaming Media v2012.12.18)
Session: 755163C8
Range: npt=0.000-
array = *PLAY rtsp://192.168.1.44:8554/123445 RTSP/1.0*
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

發佈了196 篇原創文章 · 獲贊 34 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章