从pcap文件的rtp包中提取264码流并保存(c语言)
工程代码:https://download.csdn.net/download/qq_40588509/12694310?spm=1001.2014.3001.5503
一、主要流程
1、从pcap文件中提取rtp数据
2、将rtpbuf[]中存放的被分片的nal数据进行判断,后按类型规范写入h264文件,记得ox00000001的起始符
二、重要结构
1、pcap文件结构,详见https://blog.csdn.net/tonyzbx/article/details/76795017
2、rtp包结构,详见https://www.cnblogs.com/dchipnau/p/5460026.html
三、重点讲解
1、重点:pcap文件头是24字节,他所携带数据包的头是16字节,这些小数据包头中有咱们需要的关键量pktHeader->len标明了数据包携带的数据长度,这些数据结构是这样的:
EthHeader(14B) | IPHeader(20B) | UDPHeader(8B) | RTP包 |
容易得出RTP包长度rtp_len=pktHeader->len-14-20-8
2、重点:确定每个rtp包的起点,我通过读取udp头的端口号来实现,这里也需要大小端存储的知识,比如你抓的包从wireshark看到实际的scr_port=8228,其十六进制为2024,大小端转换后为2420,转为十进制则为9248,即可写if (Src_port == 9248),再在其下操作。
3、重点:大小端存储,intel 的cpu 是intel为小端字节序(低端存到底地址) 而网络流为大端字节序(高端存到低地址)用rtp的包头举个例子,
intel 的cpu : 高端->csrc_len:4 -> extension:1-> padding:1 -> version:2 ->低端
在内存中存储 :
低->4001(内存地址)version:2
4002(内存地址)padding:1
4003(内存地址)extension:1
高->4004(内存地址)csrc_len:4
网络传输解析 : 高端->version:2->padding:1->extension:1->csrc_len:4->低端 (为正确的文档描述格式)
存入接收内存 :
低->4001(内存地址)version:2
4002(内存地址)padding:1
4003(内存地址)extension:1
高->4004(内存地址)csrc_len:4
本地内存解析 :高端->csrc_len:4 -> extension:1-> padding:1 -> version:2 ->低端 ,
即:
unsigned char csrc_len:4; // expect 0
unsigned char extension:1; // expect 1
unsigned char padding:1; // expect 0
unsigned char version:2; // expect 2,
4、重点:确定遍历数据包时的偏移量,实现每个rtp包分界,非常容易,通过理解pcap文件的结构解决,偏移量ptk_offset += 16 + pktHeader->caplen。