通过TCP使用RTSP抓取视频
我想从带有RTSP的设备中检索一些视频数据 UDP上的RTSP运行良好,但我需要TCP上的RTSP 发出RTSP命令后,我收到RTP,但我不知道如何在这里处理它们。 有效负载如下:$[通道-1字节][长度-2字节][数据] 问题是,我收到这样的数据包,有时在通道为10或99等的情况下收到更多的数据包 那么,有谁能提供一些关于如何处理有效载荷的信息吗?你已经准备好了。您需要10.12嵌入式交错二进制数据: 流数据(如RTP数据包)由ASCII美元符号24十六进制封装,后跟一个单字节通道标识符,后跟封装的二进制数据的长度,作为网络字节顺序的二进制、双字节整数。流数据紧跟其后,没有CRLF,但包括上层协议头。每个$block正好包含一个上层协议数据单元,例如,一个RTP数据包 还有一个小例子:通过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十六进制封装,后跟一个单字节通道标识符,后跟
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接收的数据相同。