使用RTSP通过TCP抓取视频

时间:2012-08-24 13:37:34

标签: tcp h.264 rtsp rtp

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

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

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

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

那么有人可以就如何处理有效载荷提供一些意见吗?

4 个答案:

答案 0 :(得分: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}

答案 1 :(得分:1)

获取PPS是IMO的直截了当,并不需要解析数据包。

您的SPS请求,我猜测,需要进入数据包(我不认为您需要担心WS msg'无效数据包'。

在0x09使用PT时输入怎么样?

请参阅here了解数据包说明

在答案here

中解压缩RTP的示例实现

尝试查看here以获取有关RTSP控制和TCP上SDP的更多信息。如果您正在检查RTSP会话/对话的详细信息以及有关视频中相应轨道的控制协议选择的消息传递详细信息。如果你可以在没有转入SDP / RTCP的情况下得到你的答案,那么显然,那更快/更好。

答案 2 :(得分:1)

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

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

其余的就像upd

了解更多信息,请阅读process raw rtp packets

答案 3 :(得分:0)

请解释一下,我也正在为此工作,如果您想通过TCP使用RTSP,请注意套接字读取代码。 合适的套接字过程如下:

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);
        }
     }
  }
}