forked from JeremyGrosser/mpegts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmpeg2.py
executable file
·86 lines (74 loc) · 2.5 KB
/
mpeg2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env python
import sys
import traceback
import socket
import struct
import datetime
from pat import PMTTable
from pat import PATTable
from mpeg_packet import TSPacket
from mpeg_packet import PESPacket
def start_collection(multicast, pid=-1, scte=False):
ip_address = multicast.split(':')[0]
port = multicast.split(':')[1]
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((ip_address,int(port)))
mreq = struct.pack("4sl", socket.inet_aton(ip_address), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
psize = 188
chunksize = 7
counter = 0
PATchecked = False
PMTchecked = False
while True:
data = b''
for i in range(0,chunksize):
l_data = sock.recv(10240)
data += l_data
if not data:
break
# Chop off anything before the sync bit
sync_offset = data.find('\x47')
if sync_offset == -1:
print 'No sync bit in packet.'
continue
if sync_offset != 0:
print 'Resync'
data = data[sync_offset:]
for i in range(chunksize):
packet = data[:psize]
data = data[psize:]
packet = TSPacket(packet)
if (PATchecked == False and packet.pid == 0):
pat = PATTable(packet.raw_data)
print('\nPAT found: Program ' + str(pat.program))
print('\tPID found: ' + str(pat.pid))
PATchecked = True
if (pid == -1 or packet.pid == pid):
print('')
sys.stdout.write(str(datetime.datetime.now()) + ' - ')
print(packet)
try:
pes = PESPacket(packet)
#print(pes.streamtype)
except:
print('Oops')
counter += 1
#Print out counter info
if (counter % 100 == 0 and False):
prefix = 'Mbits checked: '
mb = counter * psize * chunksize * 8 / (1024 * 1024)
for i in range(0,len(str(mb)) + len(prefix)):
sys.stdout.write('\b \b')
sys.stdout.flush()
sys.stdout.write(prefix + str(mb))
sys.stdout.flush()
if __name__ == '__main__':
if (len(sys.argv) < 2):
print('Usage: ' + sys.argv[0] + ' <multicast>:<port> [pid]')
sys.exit(0)
pid = -1
if (len(sys.argv) >= 3):
pid = int(sys.argv[2])
start_collection(sys.argv[1], pid)