从pcap文件的rtp包中提取264码流并保存(c语言)

从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。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Python中,将pcap包中的h264保存下来可以通过使用第三方库,例如Pyshark和ffmpeg来实现。 首先,需要安装Pyshark库。可以使用以下命令在命令行中安装Pyshark: ``` pip install pyshark ``` 接下来,需要使用Pyshark打开pcap文件并抓取h264流。下面是实现这一步骤的代码示例: ```python import pyshark # 打开pcap文件 cap = pyshark.FileCapture('your_pcap_file.pcap') # 遍历抓取h264流 h264_stream = [] for packet in cap: try: if 'h264' in packet.layers: h264_layer = packet.get_layer('h264') h264_stream.append(h264_layer) except AttributeError: pass # 关闭文件捕获 cap.close() ``` 上述代码段将从pcap文件中抓取所有的h264流,并将其存储在一个列表中。 最后,可以使用ffmpeg库将h264保存到本地文件中。以下是通过ffmpeg实现此步骤的示例代码: ```python import subprocess # 使用subprocess模块调用ffmpeg命令 def save_h264_stream(h264_stream, output_file): # 创建一个将h264保存文件的ffmpeg命令 ffmpeg_command = ['ffmpeg', '-f', 'h264', '-i', 'pipe:', output_file] # 启动一个新的子进程来执行ffmpeg命令 process = subprocess.Popen(ffmpeg_command, stdin=subprocess.PIPE) # 将h264流写入ffmpeg的标准输入 for packet in h264_stream: process.stdin.write(packet.get_raw_packet()) # 关闭ffmpeg的标准输入 process.stdin.close() # 等待ffmpeg进程完成 process.wait() # 调用函数将h264保存文件 output_file = 'output.h264' save_h264_stream(h264_stream, output_file) ``` 上述代码将h264流写入ffmpeg的标准输入,然后使用ffmpeg命令将标准输入的数据保存到指定的输出文件中。 总结起来,通过使用Pyshark库抓取pcap文件中的h264流,然后使用ffmpeg将流保存到本地文件中,就可以实现将pcap包中的h264保存下来的目标。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值