1

我想从带有 RTSP 的设备中检索一些视频数据。

RTSP over UDP 运行良好,但我需要它通过 TCP。

发出 RTSP 命令后,我收到了 RTP,但我不知道如何在此处处理它们。有效载荷如下:$[channel - 1 byte][length - 2bytes][data]

问题是我收到了这样的数据包,有时还会收到更多的数据包,其中通道为 10 或 99 等。

那么任何人都可以提供一些关于如何处理有效载荷的输入吗?

4

4 回答 4

2

您可以在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}
于 2012-08-24T13:41:17.873 回答
1

获取 PPS 很简单,不需要解析数据包。

我猜您对 SPS 的请求将需要进入数据包(我认为您无需担心 WS msg 'invalid packet'。

在 0x09 的 PT 处使用 Type 怎么样?

有关数据包说明,请参见此处

在此处的答案中解包 RTP 的示例实现

尝试在此处查找有关 RTSP 控制和基于 TCP 的 SDP 的更多信息。如果您要检查 RTSP 会话/对话的详细信息以及有关视频中各个轨道的控制协议选择的消息传递详细信息。如果您可以在不转移到 SDP / RTCP 的情况下获得答案,那么显然,那会更快/更好。

于 2012-08-24T14:05:01.533 回答
1

这是 TCP/RTP 的数据包格式:

[$ - 1byte][Transport Channel - 1byte][RTP data length - 2bytes][RTP data]

其余的就像 upd

有关更多信息,请阅读处理原始 rtp 数据包

于 2012-09-01T09:41:57.297 回答
0

解释一下,我也在为此工作,如果你想通过 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);
        }
     }
  }
}
于 2020-09-30T03:34:26.883 回答