一個RTSP/RTP over TCP 的丟包引起的問題


背景知識:可以查看https://www.cnblogs.com/lidabo/p/4483497.html

RTSP/RTP over TCP
TCP承載RTSP/RTP
 
When you use RTSP/RTP over TCP, all command and media data will be sent through the RTSP port, normally, port 554. Also, when using
當使用TCP協議承載RTSP/RTP時,所有的命令和媒體數據都將通過RTSP端口,通常是554,進行發送。同時,數據將經過二元交織格式化之后才能發
RTSP/RTP over TCP, the data will be sent via binary interleave format.
送。
 
Below will describe the essential for using RTSP/RTP over TCP
接下來我們將描述使用TCP承載RTSP/RTP的主要要素:
 
SETUP
 
To use TCP communication, you need to request TCP connection during RTSP SETUP. You have to sent SETUP command with
要使用TCP連接,RTSP客戶端需要在SETUP階段請求TCP連接。SETUP命令中應該包括如下格式的Transport:
Transport: RTP/AVP/TCP;interleaved=0-1
This will tell the server to send media data with TCP and interleave the data in channel 0 and 1. Given in the specification, data channel is even
上述Transport將告訴服務端使用TCP協議發送媒體數據,並且使用信道 0 和 1 對流數據以及控制信息進行交織。詳細說來,使用偶數信道作為數據
number and control channel is odd (data_ch_num + 1). So, if you data channel is 0, your control channel will be 0 + 1 = 1.
傳輸信道,使用奇數信道作為控制信道(數據信道 + 1)。所以,如果你設定數據信道為 0 ,那控制信道應該是 0 + 1 = 1。
 
Below is an example of TCP SETUP
 
RTP Data
 
After the setup, RTP data will be sent through the TCP socket that is used for RTSP commands. The RTP data will be encapsulate in the following format
SETUP之后,RTP數據將通過用來發送RTSP命令的TCP Socket進行發送。RTP數據將以如下格式進行封裝:
| magic number | channel number | embedded data length | data |
magic number - 1 byte value of hex 0x24
RTP數據標識符,"$"
channel number - 1 byte value to denote the channel
信道數字 - 1個字節,用來指示信道
embedded data length - 2 bytes to denote the embedded data length
數據長度 - 2個字節,用來指示插入數據長度
data - data packet, ie RTP packet, with the total length of the embedded data length
數據 - 數據包,比如說RTP包,總長度與上面的數據長度相同
Below is a full example of the communication exchanged
下面是交互過程的一個完整示例:
問題描述:
 當我們的rtp定位符丟失之后,機頂盒應該如何在不重新建聯的情況下,保證后面的播放?
1.定位符$(0x24)這部分丟失,也就是不知道信道,也不知道長度,由於是tcp,無法知道下一個定位符在哪。
2.如果遍歷后面的報文,可能是媒體,也可能是信令,則0x24可能會找錯,比如媒體數據里面有0x24.
3.定位符丟失的原因可能是因為前面的rtp媒體數據丟失,后面連着一個定位符,但是被機頂盒解碼為媒體數據,這樣相當於后面那個定位符就丟失了。
4.tcp按道理是不會丟包,但是由於用戶態在多次tryagain的時候,到時間就可能需要發送下一個報文了(處於實時性考慮),這樣就出現了丟包現象。
 
解決方法:
媒體服務器發包的時候,保證原子性,因為tcp會重傳,那么唯一丟失rtp定位符是的可能條件是,應用程序在發包的時候,發送到定位符部分,而socket由於buf是滿的,
會導致我們應用程序重試,假設那段時間一直重試失敗,則有可能導致發送下一個報文。這就要求在tcp發送的時候,必須一直重試,而在udp的時候,可以重試幾次后
發送下一個報文,因為udp的是有界的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM