1. 程式人生 > >基於EasyDarwin的實現無人機遠端視訊傳輸--RTSP協議分析篇

基於EasyDarwin的實現無人機遠端視訊傳輸--RTSP協議分析篇

申明該文章參考了http://blog.csdn.net/haolipengzhanshen/article/details/50802081 的文章,在這裡標示感謝!

這篇文章主要從幾個方面分析EasyDarwin的RTSP內容
RTSP協議概述
wireshark抓包例項分析 一次完整RTSP的互動流程
EasyDarwin專案程式碼中 RTSP的初始化
EasyDarwin專案程式碼中 RTSP請求的處理過程

如果你是隻想實現視訊流的傳輸,對轉發伺服器沒有太大要求,建議只要研究EasyDarwin的客戶端即可,客戶端涉及到解碼播放顯示在地面站上。對於EasyDarwin的使用在EasyDarwin的官方有詳細說明。

第一部分:RTSP協議

一、RTSP協議概述

RTSP(Real-TimeStream Protocol )是一種基於文字的應用層協議,在語法及一些訊息引數等方面,RTSP協議與HTTP協議類似。HTTP協議相信大家都比較熟悉了.

RTSP被用於建立的控制媒體流的傳輸,它為多媒體服務扮演“網路遠端控制”的角色。儘管有時可以把RTSP控制資訊和媒體資料流交織在一起傳送,但一般情況RTSP本身並不用於轉送媒體流資料。媒體資料的傳送可通過RTP/RTCP等協議來完成。

一次基本的RTSP操作過程是:
首先,客戶端連線到流伺服器併發送一個RTSP描述命令(DESCRIBE)。
流伺服器通過一個SDP描述來進行反饋,反饋資訊包括流數量、媒體型別等資訊。
客戶端再分析該SDP描述,併為會話中的每一個流傳送一個RTSP建立命令(SETUP),RTSP建立命令告訴伺服器客戶端用於接收媒體資料的埠。
流媒體連線建立完成後,客戶端傳送一個播放命令(PLAY),伺服器就開始在UDP上傳送媒體流(RTP包)到客戶端。
在播放過程中客戶端還可以向伺服器傳送命令來控制快進、快退和暫停等。最後,客戶端可傳送一個終止命令(TERADOWN)來結束流媒體會話

二、RTSP 重要方法
20160304135129789 C->S 表示從客戶端給伺服器發資料,S->C表示從伺服器給客戶端發資料。通過以上幾個方法完成客戶端和伺服器之間的指令互動,構成RTSP協議的基本框架。

我們用 wireshark來分析下這個RTSP的命令流程熟悉指令流程對於我們理解EasyDarwin有很重要的幫助。

來分析下rtsp包:

24

圖1.1 客戶端推流給伺服器

09904                                        圖1.2 播放器從伺服器獲得視訊流

RTSP協議基本流程,我們開啟EasyDarwin工程執行,流媒體伺服器。

1.C->S:OPTION request //詢問S有哪些方法可用 
1.S->C:OPTION response //S迴應資訊中包括提供的所有可用方法 
2.C->S:DESCRIBE request //要求得到S提供的媒體初始化描述資訊 
2.S->C:DESCRIBE response //S迴應媒體初始化描述資訊,主要是sdp 
客戶端向伺服器端傳送DESCRIBE,用於得到URI所指定的媒體描述資訊,一般是SDP資訊。客戶端通過Accept頭指定客戶端可以接受的媒體述資訊型別。 
OPTIONS 欄位後的rtsp://192.168.1.100:8003/st0.sdp RTSP/1.0\r\n 
是請求的Server上的URI資源。
Content-Type: application/sdp //表示迴應為SDP資訊
Content-Length: 1383 //以下為具體的SDP資訊 媒體描述是我們分析時常用的。
v=<version> 
o=<username> <session id> <version> <network type> <address type> <address> 
s=<session name> 
i=<session description> 
u=<URI> 
e=<email address> 
p=<phone number> 
c=<network type> <address type> <connection address> 
b=<modifier>:<bandwidth-value> 
t=<start time> <stop time> 
r=<repeat interval> <active duration> <list of offsets from start-time> 
z=<adjustment time> <offset> <adjustment time> <offset> .... 
k=<method> 
k=<method>:<encryption key> 
a=<attribute> 
a=<attribute>:<value> 
m=<media> <port> <transport> <fmt list> 
v = (協議版本) 
o = (所有者/建立者和會話識別符號) 
s = (會話名稱) 
i = * (會話資訊) 
u = * (URI 描述) 
e = * (Email 地址) 
p = * (電話號碼) 
c = * (連線資訊) 
b = * (頻寬資訊) 
z = * (時間區域調整) 
k = * (加密金鑰) 
a = * (0 個或多個會話屬性行) 
時間描述: 
t = (會話活動時間) 
r = * (0或多次重複次數) 
媒體描述: 
m = (媒體名稱和傳輸地址) 
i = * (媒體標題) 
c = * (連線資訊 — 如果包含在會話層則該欄位可選) 
b = * (頻寬資訊) 
k = * (加密金鑰) 
a = * (0 個或多個媒體屬性行)
3.C->S:SETUP request //設定會話的屬性,以及傳輸模式,提醒S建立會話 
3.S->C:SETUP response //S建立會話,返回會話識別符號,以及會話相關資訊 

用於確定轉輸機制,建立RTSP會話。客戶端能夠發出一個SETUP請求為正在播放的媒體流改變傳輸引數,伺服器可能同意這些引數的改變。若是不同意,它必須響應錯誤”455 Method Not Valid In This State”
4.C->S:PLAY request //C請求播放 
4.S->C:PLAY response //S迴應該請求的資訊 
方法告知伺服器通過SETUP中指定的機制開始傳送資料 。在尚未收到SETUP請求的成功應答之前,客戶端不可以發出PLAY請求。PLAY請求將正常播放時間(normal play time)定位到指定範圍的起始處,並且傳輸資料流直到播放範圍結束。PLAY請求可能被管道化(pipelined),即放入佇列中(queued);伺服器必須將PLAY請求放到佇列中有序執行。也就是說,後一個PLAY請求需要等待前一個PLAY請求完成才能得到執行。
5.S->C:傳送流媒體資料 
6.C->S:TEARDOWN request //C請求關閉會話 
6.S->C:TEARDOWN response //S迴應該請求 
一個完整的RTSP協議請求流程就是這樣

上述的過程只是標準的、友好的rtsp流程,但實際的需求中並不一定按此過程。

其中第三和第四步是必需的!第一步,只要伺服器客戶端約定好,有哪些方法可用,則option請求可以不要。第二步,如果我們有其他途徑得到媒體初始化描述資訊(比如http請求等等),則我們也不需要通過rtsp中的describe請求來完成。

QQ群: 526221258