前言
实时会议中,需要对音视频的rtp码流进行重放。所以写了一个rtp发包器脚本
pcap发包器
import socket
import binascii
import time
import os
ipv = 0
if ipv == 0:
IP = "xxx.xx.xx.xxx"
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
iplen = 20
else:
IP = "fe80::548f:7fe5:7db7:bc26"
s = socket.socket(socket.AF_INET6,socket.SOCK_DGRAM)
iplen = 40
PORT = 4000
s.bind((IP,6000))
i = 0
j = 0
boom = 0
skip = 0
Linux_or_Win = 0
choose_loop = 0
f = open('D:\\2565_eth.pcap','rb')
fsize = os.path.getsize('D:\\2565_eth.pcap')
ff = open('D:\medialen','w')
while True:
f.read(24)
i = i + 1
if choose_loop == 0:
if i == 2:
break
while True:
print("Send %d times" % (i))
j = j + 1
skip = skip + 1
print("NO.%d" % (j))
high = f.read(4)
high = binascii.b2a_hex(high).decode('utf-16-be')[::-1].encode('utf-16-be')
low = f.read(4)
low = binascii.b2a_hex(low).decode('utf-16-be')[::-1].encode('utf-16-be')
timesth = int(high,16)
timestl = int(low,16)
timeReal = timesth + timestl*0.000001
if skip > 1:
intv = timeReal - boom
else:
intv = 0
print("last packet to this packet intv : %f " % (intv))
boom = timeReal
rlen = f.read(4)
trlen = binascii.b2a_hex(rlen).decode('utf-16-be')[::-1].encode('utf-16-be')
dtrlen = int(trlen,16)
print("This packet real-length : %d " % (dtrlen))
f.read(4)
if Linux_or_Win == 1:
f.read(16)
sum = 16 + 8 + iplen
else:
f.read(14)
sum = 14 + 8 + iplen
f.read(iplen)
f.read(4)
n = f.read(2)
t = binascii.b2a_hex(n)
dec = int(t,16)
f.read(2)
dec = dec - 8
print("RTP Packet length: %d " % (dec))
if dec > 1500:
print("Warning: this packet is so big !!!")
elif dec <= 0:
print("Errors: this packet maybe wrong !!!")
n = f.read(dec)
size = f.tell()
print("The location of the Rtp packet in the file: %d " % (size))
print("....................................................")
if intv >= 0.001:
time.sleep(0.8*intv)
s.sendto(n,(IP,PORT))
tbt = dec-12
ff.write("\n%d" % (tbt))
if size >= fsize:
f.seek(0)
j = 0
skip = 0
boom = 0
break
else:
padlength = dtrlen - sum - dec
print(padlength)
f.read(padlength)