一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

從零開始寫一個RTSP服務(wù)器(一)RTSP協(xié)議講解

 袁先森lemon 2021-08-18

前言

  • 為什么要寫這個系列?

    因為我自己在學(xué)習(xí)rtsp協(xié)議想自己從零寫一個rtsp服務(wù)器的時候,由于rtsp比較復(fù)雜,所以覺得這個過程非常的困難,網(wǎng)上許多相關(guān)文章或模棱兩可,或是復(fù)制粘貼。所以想寫這樣一個系列,來幫助想要學(xué)習(xí)rtsp協(xié)議或者想要從零寫一個rtsp服務(wù)器的初學(xué)者

  • 本系列的文章特點

    并系列文章實現(xiàn)追求精簡,能夠讓人明白rtsp協(xié)議的實現(xiàn)過程,不追求復(fù)雜和完美

    如果想要實現(xiàn)一個比較完善的rtsp服務(wù)器,可以參考我的開源項目-RtspServer

言歸正傳,下面開始本系列的文章

一、什么是RTSP協(xié)議?

RTSP是一個實時傳輸流協(xié)議,是一個應(yīng)用層的協(xié)議

通常說的RTSP包括RTSP協(xié)議、RTP協(xié)議、RTCP協(xié)議

對于這些協(xié)議的作用簡單的理解如下

RTSP協(xié)議:負責(zé)服務(wù)器與客戶端之間的請求與響應(yīng)

RTP協(xié)議:負責(zé)傳輸媒體數(shù)據(jù)

RTCP協(xié)議:在RTP傳輸過程中提供傳輸信息

rtsp承載與rtp和rtcp之上,rtsp并不會發(fā)送媒體數(shù)據(jù),而是使用rtp協(xié)議傳輸

rtp并沒有規(guī)定發(fā)送方式,可以選擇udp發(fā)送或者tcp發(fā)送

二、RTSP協(xié)議詳解

rtsp的交互過程就是客戶端請求,服務(wù)器響應(yīng),下面看一看請求和響應(yīng)的數(shù)據(jù)格式

2.1 RTSP數(shù)據(jù)格式

RTSP協(xié)議格式與HTTP協(xié)議格式類似

  • RTSP客戶端的請求格式

    method url vesion\r\n
    CSeq: x\r\n
    xxx\r\n
    ...
    \r\n

    method:方法,表明這次請求的方法,rtsp定義了很多方法,稍后介紹

    url:格式一般為rtsp://ip:port/session,ip表主機ip,port表端口好,如果不寫那么就是默認端口,rtsp的默認端口為554,session表明請求哪一個會話

    version:表示rtsp的版本,現(xiàn)在為RTSP/1.0

    CSeq:序列號,每個RTSP請求和響應(yīng)都對應(yīng)一個序列號,序列號是遞增的

  • RTSP服務(wù)端的響應(yīng)格式

    vesion 200 OK\r\n
    CSeq: x\r\n
    xxx\r\n
    ...
    \r\n

    version:表示rtsp的版本,現(xiàn)在為RTSP/1.0

    CSeq:序列號,這個必須與對應(yīng)請求的序列號相同

2.2 RTSP請求的常用方法

方法描述
OPTIONS獲取服務(wù)端提供的可用方法
DESCRIBE向服務(wù)端獲取對應(yīng)會話的媒體描述信息
SETUP向服務(wù)端發(fā)起建立請求,建立連接會話
PLAY向服務(wù)端發(fā)起播放請求
TEARDOWN向服務(wù)端發(fā)起關(guān)閉連接會話請求

2.3 RTSP交互過程

有了上述的知識,我們下面來講解一個RTSP的交互過程

OPTIONS

  • C–>S

    OPTIONS rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
    CSeq: 2\r\n
    \r\n

    客戶端向服務(wù)器請求可用方法

  • S–>C

    RTSP/1.0 200 OK\r\n
    CSeq: 2\r\n
    Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY\r\n
    \r\n

    服務(wù)端回復(fù)客戶端,當(dāng)前可用方法OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY

DESCRIBE

  • C–>S

    DESCRIBE rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
    CSeq: 3\r\n
    Accept: application/sdp\r\n
    \r\n

    客戶端向服務(wù)器請求媒體描述文件,格式為sdp

  • S–>C

    RTSP/1.0 200 OK\r\n
    CSeq: 3\r\n
    Content-length: 146\r\n
    Content-type: application/sdp\r\n
    \r\n
    
    v=0\r\n
    o=- 91565340853 1 in IP4 192.168.31.115\r\n
    t=0 0\r\n
    a=contol:*\r\n
    m=video 0 RTP/AVP 96\r\n
    a=rtpmap:96 H264/90000\r\n
    a=framerate:25\r\n
    a=control:track0\r\n

    服務(wù)器回復(fù)了sdp文件,這個文件告訴客戶端當(dāng)前服務(wù)器有哪些音視頻流,有什么屬性,具體稍后再講解

    這里只需要直到客戶端可以根據(jù)這些信息得知有哪些音視頻流可以發(fā)送

SETUP

  • C–>S

    SETUP rtsp://192.168.31.115:8554/live/track0 RTSP/1.0\r\n
    CSeq: 4\r\n
    Transport: RTP/AVP;unicast;client_port=54492-54493\r\n
    \r\n

    客戶端發(fā)送建立請求,請求建立連接會話,準(zhǔn)備接收音視頻數(shù)據(jù)

    解析一下Transport: RTP/AVP;unicast;client_port=54492-54493\r\n

    RTP/AVP:表示RTP通過UDP發(fā)送,如果是RTP/AVP/TCP則表示RTP通過TCP發(fā)送

    unicast:表示單播,如果是multicast則表示多播

    client_port=54492-54493:由于這里希望采用的是RTP OVER UDP,所以客戶端發(fā)送了兩個用于傳輸數(shù)據(jù)的端口,客戶端已經(jīng)將這兩個端口綁定到兩個udp套接字上,54492表示是RTP端口,54493表示RTCP端口(RTP端口為某個偶數(shù),RTCP端口為RTP端口+1)

  • S–>C

    RTSP/1.0 200 OK\r\n
    CSeq: 4\r\n
    Transport: RTP/AVP;unicast;client_port=54492-54493;server_port=56400-56401\r\n
    Session: 66334873\r\n
    \r\n

    服務(wù)端接收到請求之后,得知客戶端要求采用RTP OVER UDP發(fā)送數(shù)據(jù),單播,客戶端用于傳輸RTP數(shù)據(jù)的端口為54492,RTCP的端口為54493

    服務(wù)器也有兩個udp套接字,綁定好兩個端口,一個用于傳輸RTP,一個用于傳輸RTCP,這里的端口號為56400-56401

    之后客戶端會使用54492-54493這兩端口和服務(wù)器通過udp傳輸數(shù)據(jù),服務(wù)器會使用56400-56401這兩端口和這個客戶端傳輸數(shù)據(jù)

PLAY

  • C–>S

    PLAY rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
    CSeq: 5\r\n
    Session: 66334873\r\n
    Range: npt=0.000-\r\n
    \r\n

    客戶端請求播放媒體

  • S–>C

    RTSP/1.0 200 OK\r\n
    CSeq: 5\r\n
    Range: npt=0.000-\r\n
    Session: 66334873; timeout=60\r\n
    \r\n

    服務(wù)器回復(fù)之后,會開始使用RTP通過udp向客戶端的54492端口發(fā)送數(shù)據(jù)

TEARDOWN

  • C–>S

    TEARDOWN rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
    CSeq: 6\r\n
    Session: 66334873\r\n
    \r\n
  • S–>C

    RTSP/1.0 200 OK\r\n
    CSeq: 6\r\n
    \r\n

2.4 sdp格式

我們上面避開沒有講sdp文件,這里來好好補一補

sdp格式由多行的type=value組成

sdp會話描述由一個會話級描述和多個媒體級描述組成。會話級描述的作用域是整個會話,媒體級描述描述的是一個視頻流或者音頻流

會話級描述v=開始到第一個媒體級描述結(jié)束

媒體級描述m=開始到下一個媒體級描述結(jié)束

下面是上面示例的sdp文件,我們就來好好分析一下這個sdp文件

v=0\r\n
o=- 91565340853 1 in IP4 192.168.31.115\r\n
t=0 0\r\n
a=contol:*\r\n
m=video 0 RTP/AVP 96\r\n
a=rtpmap:96 H264/90000\r\n
a=framerate:25\r\n
a=control:track0\r\n

這個示例的sdp文件包含一個會話級描述一個媒體級描述,分別如下

  • 會話級描述

    v=0\r\n
    o=- 91565340853 1 IN IP4 192.168.31.115\r\n
    t=0 0\r\n
    a=contol:*\r\n

    v=0

    表示sdp的版本
    o=- 91565340853 1 IN IP4 192.168.31.115
    格式為 o=<用戶名> <會話id> <會話版本> <網(wǎng)絡(luò)類型><地址類型> <地址>
    用戶名:-
    會話id:91565340853,表示rtsp://192.168.31.115:8554/live請求中的live這個會話
    會話版本:1
    網(wǎng)絡(luò)類型:IN,表示internet
    地址類型:IP4,表示ipv4
    地址:192.168.31.115,表示服務(wù)器的地址

  • 媒體級描述

    m=video 0 RTP/AVP 96\r\n
    a=rtpmap:96 H264/90000\r\n
    a=framerate:25\r\n
    a=control:track0\r\n

    m=video 0 RTP/AVP 96\r\n

    格式為 m=<媒體類型> <端口號> <傳輸協(xié)議> <媒體格式 >
    媒體類型:video

    端口號:0,為什么是0?因為上面在SETUP過程會告知端口號,所以這里就不需要了

    傳輸協(xié)議:RTP/AVP,表示RTP OVER UDP,如果是RTP/AVP/TCP,表示RTP OVER TCP

    媒體格式:表示負載類型(payload type),一般使用96表示H.264

    a=rtpmap:96 H264/90000

    格式為a=rtpmap:<媒體格式><編碼格式>/<時鐘頻率>

    a=framerate:25

    表示幀率

    a=control:track0

    表示這路視頻流在這個會話中的編號

三、RTP協(xié)議

3.1 RTP包格式

rtp包由rtp頭部和rtp荷載構(gòu)成

  • RTP頭部

在這里插入圖片描述

版本號(V):2Bit,用來標(biāo)志使用RTP版本

填充位§:1Bit,如果該位置位,則該RTP包的尾部就包含填充的附加字節(jié)

擴展位(X):1Bit,如果該位置位,則該RTP包的固定頭部后面就跟著一個擴展頭部

CSRC技術(shù)器(CC):4Bit,含有固定頭部后面跟著的CSRC的數(shù)據(jù)

標(biāo)記位(M):1Bit,該位的解釋由配置文檔來承擔(dān)

載荷類型(PT):7Bit,標(biāo)識了RTP載荷的類型

序列號(SN):16Bit,發(fā)送方在每發(fā)送完一個RTP包后就將該域的值增加1,可以由該域檢測包的丟失及恢復(fù)

包的序列。序列號的初始值是隨機的

時間戳:32比特,記錄了該包中數(shù)據(jù)的第一個字節(jié)的采樣時刻

同步源標(biāo)識符(SSRC):32比特,同步源就是RTP包源的來源。在同一個RTP會話中不能有兩個相同的SSRC值

貢獻源列表(CSRC List):0-15項,每項32比特,這個不常用

  • rtp荷載

    rtp載荷為音頻或者視頻數(shù)據(jù)

3.2 RTP OVER TCP

RTP默認是采用UDP發(fā)送的,格式為RTP頭+RTP載荷,如果是使用TCP,那么需要在RTP頭之前再加上四個字節(jié)

第一個字節(jié):$,辨識符

第二個字節(jié):通道,在SETUP的過程中獲取

第三第四個字節(jié): RTP包的大小,最多只能12位,第三個字節(jié)保存高4位,第四個字節(jié)保存低8位

四、RTCP

RTCP用于在RTP傳輸過程中提供傳輸信息,可以報道RTP傳輸情況,還可以用來音視頻同步,這里就不詳細講解了

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    在线中文字幕亚洲欧美一区| 99久久精品视频一区二区| 色老汉在线视频免费亚欧| 国产精品成人一区二区三区夜夜夜| 午夜色午夜视频之日本| 91偷拍与自偷拍精品| 成人精品网一区二区三区| 国产男女激情在线视频| 视频一区中文字幕日韩| 我想看亚洲一级黄色录像| 亚洲视频偷拍福利来袭| 日本免费一级黄色录像| 国产精品不卡高清在线观看| 国产老熟女乱子人伦视频| 日韩精品一区二区三区射精| 欧美精品一区二区三区白虎| 日韩国产传媒在线精品| 极品少妇嫩草视频在线观看| 老熟妇2久久国内精品| 色综合久久六月婷婷中文字幕| 亚洲国产成人av毛片国产| 欧美一区二区三区十区| 精品伊人久久大香线蕉综合| 日本乱论一区二区三区| 中国少妇精品偷拍视频| 亚洲高清欧美中文字幕| 国产精品欧美一级免费| 人人爽夜夜爽夜夜爽精品视频| 视频一区二区三区自拍偷| 国产成人午夜在线视频| 激情五月激情婷婷丁香| 日韩一区二区三区高清在| 国产成人亚洲综合色就色| 色婷婷人妻av毛片一区二区三区| 色综合伊人天天综合网中文| 国产精品欧美一级免费| 夜夜嗨激情五月天精品| 亚洲中文字幕在线观看黑人| 在线欧美精品二区三区| 大伊香蕉一区二区三区| 一区二区三区四区亚洲专区|