问题是它永远不会成功... 期望我们使用RTP扩展标头,但是如果我使用Wireshark提取并解码,则会失败。 即使我遵循Parrot-developers/libvideo-streaming的源代码(
Https://github.com/parrot-developers/libvideo-streaming/blob/master/master/src/src/src/vstrm_rtp_h264.h264.h#l140有人知道应该如何使用“填充”字段?在文档中没有提到(
https://developer.parrot.com/docs/groundsdk-tools/video-metadata.html#id4)
有人从事这样的事情吗? 我终于设法找到了一个解决方案。 我的问题来自缺乏鹦鹉的文档。如果我们看一下C库(
https://github.com/parrot-developers/libvideo-streaming/blob/blob/bfd02a6c385dcd4645dcd4645dfe8a7979797973f2e426e426 e75199a see see see see see see see see see we a we we we an44444444444.h2664.h264.h2644.h2644.h264.h 2扩展标头的标题(是的,有点复杂)。要包装一下,您需要跳过12个字节RTP标头,检查以下两个字节是否等于0x5062(Protobuf格式),获取带有以下2个字节(多个BYTES的多个)的标题扩展的长度,请使用以下代码获取数据包信息:
如果curpack == LastPack我们有一个完整的原始消息。否则附加了中间缓冲区。 然后,我们可以跳过以下两个字节(代表中间缓冲区的偏移,我们不需要此),最后我们到达Protobuf Raw Data。 Protobuf消息的界限如下:
data[20 : 20+(4*(length - 1)) - padding]
实际上,可以使用以下解析功能找到扩展标头的Protobuf部分:
func parse(data []byte) error {
n := 12 // skip fixed size header
log.Printf("Initial buffer: %x", data)
version := data[n : n+2]
n += 2
log.Printf("Defined by profile: 0x%x\n", version) // 0x5062 here, so no pb
length := binary.BigEndian.Uint16(data[n : n+2])
n += 2
log.Printf("Length: %d\n", length)
packIndicator := binary.BigEndian.Uint16(data[n : n+2])
lastPack := (packIndicator >> 9) & 0x7f
curPack := (packIndicator >> 2) & 0x7f
padding := (packIndicator >> 0) & 0x03
n += 2
log.Printf("Packet: %d/%d\n", curPack, lastPack)
log.Printf("Padding: %d\n", padding)
offset := binary.BigEndian.Uint16(data[n : n+2])
n += 2
log.Printf("Offset: %d\n", offset)
rawData := data[n : int(n)+(4*int(length - 1)) - int(padding)]
log.Printf("RawData: %x", rawData)
model := vmeta.TimedMetadata{}
if err := proto.Unmarshal(rawData, &model); err != nil {
return fmt.Errorf("failed to deserialize: %v", err)
}
return nil
}