-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVideoStream.py
65 lines (51 loc) · 2.04 KB
/
VideoStream.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
from struct import pack, unpack
__author__ = 'Tibbers'
# Wraps file io
class VideoStream:
def __init__(self, filename):
if filename[0] == '/':
filename = filename[1:]
if filename[-1] == '/':
filename = filename[:-1]
self._filename = filename
self._file = None
self.frameNum = 0
self.reopen()
def reopen(self):
if self._file is not None:
self._file.close()
self._file = None
try:
self._file = open(self._filename, 'rb')
print('-' * 60 + "\nVideo file : |" + self._filename + "| read\n" + '-' * 60)
except:
print("read " + self._filename + " error")
raise IOError
self.frameNum = 0
def get_sdp(self, server_opt):
return make_sdp(server_opt)
def nextFrame(self):
"""Get next frame."""
data_in = self._file.read(5) # Get the framelength from the first 5 bytes
data_raw = bytearray(data_in)
if data_raw and len(data_raw) == 5:
data_int = (data_raw[0] - 48) * 10000 + (data_raw[1] - 48) * 1000 + (data_raw[2] - 48) * 100 + (data_raw[3] - 48) * 10 + (data_raw[4] - 48)# = #int(data.encode('hex'),16)
final_data_int = data_int
framelength = final_data_int
# Read the current frame
frame = self._file.read(framelength)
if len(frame) != framelength:
raise ValueError('incomplete frame data')
#if not (data.startswith(b'\xff\xd8') and data.endswith(b'\xff\xd9')):
# raise ValueError('invalid jpeg')
self.frameNum += 1
#print('-'*10 + "\nNext Frame (#" + str(self.frameNum) + ") length:" + str(framelength) + "\n" + '-'*10)
return frame, self.frameNum
else:
print("Got wrong number of bytes. Is it EOF?")
frameNum = self.frameNum
self.reopen()
return None, frameNum
def frameNbr(self):
"""Get frame number."""
return self.frameNum