Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过TCP使用RTSP抓取视频_Tcp_H.264_Rtsp_Rtp - Fatal编程技术网

通过TCP使用RTSP抓取视频

通过TCP使用RTSP抓取视频,tcp,h.264,rtsp,rtp,Tcp,H.264,Rtsp,Rtp,我想从带有RTSP的设备中检索一些视频数据 UDP上的RTSP运行良好,但我需要TCP上的RTSP 发出RTSP命令后,我收到RTP,但我不知道如何在这里处理它们。 有效负载如下:$[通道-1字节][长度-2字节][数据] 问题是,我收到这样的数据包,有时在通道为10或99等的情况下收到更多的数据包 那么,有谁能提供一些关于如何处理有效载荷的信息吗?你已经准备好了。您需要10.12嵌入式交错二进制数据: 流数据(如RTP数据包)由ASCII美元符号24十六进制封装,后跟一个单字节通道标识符,后跟

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

UDP上的RTSP运行良好,但我需要TCP上的RTSP

发出RTSP命令后,我收到RTP,但我不知道如何在这里处理它们。 有效负载如下:$[通道-1字节][长度-2字节][数据]

问题是,我收到这样的数据包,有时在通道为10或99等的情况下收到更多的数据包

那么,有谁能提供一些关于如何处理有效载荷的信息吗?

你已经准备好了。您需要10.12嵌入式交错二进制数据:

流数据(如RTP数据包)由ASCII美元符号24十六进制封装,后跟一个单字节通道标识符,后跟封装的二进制数据的长度,作为网络字节顺序的二进制、双字节整数。流数据紧跟其后,没有CRLF,但包括上层协议头。每个$block正好包含一个上层协议数据单元,例如,一个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}
你把一切都准备好了。您需要10.12嵌入式交错二进制数据:

流数据(如RTP数据包)由ASCII美元符号24十六进制封装,后跟一个单字节通道标识符,后跟封装的二进制数据的长度,作为网络字节顺序的二进制、双字节整数。流数据紧跟其后,没有CRLF,但包括上层协议头。每个$block正好包含一个上层协议数据单元,例如,一个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}

获取PPS在我看来非常简单,实际上并不需要解析数据包

我猜,您的SPS请求将需要进入数据包,我认为您不必担心WS-msg“无效数据包”

在0x09的PT处使用Type如何

有关数据包描述,请参阅

答案中解包RTP的示例实现


尝试通过TCP查找与RTSP控制和SDP相关的更多信息。如果您正在检查RTSP会话/对话的详细信息,以及有关视频中各个曲目的控制协议选择的消息传递详细信息。如果你能在不转入SDP/RTCP的情况下得到答案,那么显然,这会更快/更好

获取PPS非常简单,实际上不需要解析数据包

我猜,您的SPS请求将需要进入数据包,我认为您不必担心WS-msg“无效数据包”

在0x09的PT处使用Type如何

有关数据包描述,请参阅

答案中解包RTP的示例实现


尝试通过TCP查找与RTSP控制和SDP相关的更多信息。如果您正在检查RTSP会话/对话的详细信息,以及有关视频中各个曲目的控制协议选择的消息传递详细信息。如果你能在不转入SDP/RTCP的情况下得到答案,那么显然,这会更快/更好

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

[$ - 1byte][Transport Channel - 1byte][RTP data length - 2bytes][RTP data]
剩下的就像upd


有关更多信息,请阅读

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

[$ - 1byte][Transport Channel - 1byte][RTP data length - 2bytes][RTP data]
剩下的就像upd


有关更多信息,请阅读

请解释一下,我也在为此工作,如果您想通过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);
        }
     }
  }
}

请解释一下,我也在为此工作,如果您想通过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);
        }
     }
  }
}

这正是我遵循的文件;但我觉得这些数据还不够。此外,我已经用Wireshark检查了输入,并看到以下消息:[格式错误的数据包:RTP]。我是否应该连接RTP的所有有效负载,直到收到另一个有效负载,如您描述的前两行所示?此外,有效负载相当大,而数据长度仅为22字节。在这种情况下,我可以从哪里获取PPS和SPS?它应该基本上与通过UDP接收的数据相同。这正是我遵循的文档;但我觉得这些数据还不够。此外,我已经用Wireshark检查了输入,并看到以下消息:[格式错误的数据包:RTP]。我是否应该连接RTP的所有有效负载,直到收到另一个有效负载,如您描述的前两行所示?此外,有效负载相当大,而数据长度仅为22字节。在这种情况下,我可以从哪里获取PPS和SP?它应该基本上与通过UDP接收的数据相同。