我想从带有 RTSP 的设备中检索一些视频数据。
RTSP over UDP 运行良好,但我需要它通过 TCP。
发出 RTSP 命令后,我收到了 RTP,但我不知道如何在此处处理它们。有效载荷如下:$[channel - 1 byte][length - 2bytes][data]
问题是我收到了这样的数据包,有时还会收到更多的数据包,其中通道为 10 或 99 等。
那么任何人都可以提供一些关于如何处理有效载荷的输入吗?
您可以在RFC 2326 "Real Time Streaming Protocol (RTSP)"中找到所有内容。您需要“10.12 嵌入式(交错)二进制数据”:
RTP 数据包等流数据由 ASCII 美元符号(24 位十六进制)封装,后跟一个字节的通道标识符,然后是封装的二进制数据的长度,以网络字节顺序表示的二进制、两字节整数。流数据紧随其后,没有 CRLF,但包括上层协议头。每个$块正好包含一个上层协议数据单元,例如一个RTP包。
还有一个小例子:
S->C: $\000{2 byte length}{"length" bytes data, w/RTP header}
S->C: $\000{2 byte length}{"length" bytes data, w/RTP header}
S->C: $\001{2 byte length}{"length" bytes RTCP packet}
这是 TCP/RTP 的数据包格式:
[$ - 1byte][Transport Channel - 1byte][RTP data length - 2bytes][RTP data]
其余的就像 upd
有关更多信息,请阅读处理原始 rtp 数据包
解释一下,我也在为此工作,如果你想通过 TCP 使用 RTSP,请注意你的套接字读取代码。合适的socket流程如下:
while (socket.connected) {
char magic = socket.read a char;
if (magic == '$') { // is a RTP over TCP packet
byte channel = socket.read 1 byte;
unsigned short len = socket.read 2 byte; // len = ((byte1 & 0xFF) << 8) + (byte2 &0xFF);
int readTotal = 0;
byte rtpPacket[len];
while (readTotal < len) {
// read remaing bytes to rtpPacket from index readTotal
int r = socket.read(rtpPacket, readTotal, len - readTotal);
if (r > 0)
readTotal += r;
else // -1 means socket read error
break;
}
// now we get full RTP packet, process it!
call back channel, rtpPacket;
} else { // is RTSP protocol response
string array header;
while (line = socket.readline() != null) {
if (line == "") {
int body_len = Parse header "Content-Length";
byte body[body_len];
int readBody = 0;
while (readBody < body_len) {
int r = socket.read(body, readBody, body_len - readBody);
if (r>0)
readBody += r;
else
break;
}
// Now we get full header, body of RTSP response, process it
Callback header, body;
} else {
header.add(line);
}
}
}
}