Skip to content

Commit 51cd312

Browse files
committed
modify 8-4.py
1 parent d941ebb commit 51cd312

1 file changed

Lines changed: 65 additions & 1 deletion

File tree

  • python3_programming_tricks/ch08

python3_programming_tricks/ch08/8-4.py

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,71 @@ def run(self):
4747
for frame in self.capture():
4848
self.send_frame(frame)
4949

50-
5150
class JpegRetriever:
51+
def __init__(self, streamer):
52+
self.streamer = streamer
53+
54+
def retrieve(self):
55+
while True:
56+
ns = os.read(self.pipe, 8)
57+
n = struct.unpack('l', ns)[0]
58+
data = os.read(self.pipe, n)
59+
yield data
60+
61+
def __enter__(self):
62+
if hasattr(self, 'pipe'):
63+
raise RuntimeError()
64+
65+
self.pipe = streamer.register()
66+
return self.retrieve()
67+
68+
def __exit__(self, *args):
69+
self.streamer.unregister(self.pipe)
70+
del self.pipe
71+
return True
72+
73+
class WebHandler(BaseHTTPRequestHandler):
74+
retriever = None
75+
76+
@staticmethod
77+
def set_retriever(retriever):
78+
WebHandler,retriever = retriever
79+
80+
def do_GET(self):
81+
if self.retriever is None:
82+
raise RuntimeError('no retriever')
83+
84+
if self.path != '/':
85+
return
86+
87+
self.send_response(200)
88+
self.send_header('Content-Type','multipart/x-mixed-replace;boundary=jpeg_frame')
89+
self.end_headers()
90+
91+
with self.retriever as frames:
92+
for frame in frames:
93+
self.send_frame(frame)
94+
95+
def send_fame(self, frame):
96+
sh = b'--jpeg_frame\r\n'
97+
sh += b'Content-Type: image/jpeg\r\n'
98+
sh += b'Content-Length: %d\r\n\r\n' % len(frame)
99+
self.wfile.write(sh)
100+
self.wfile.write(frame)
101+
102+
if __name__ == "__main__":
103+
# 创建Streamer, 开启摄像头采集
104+
streamer = JpegStreamer(0)
105+
streamer.start()
106+
107+
# http服务创建Retriever
108+
retriever = JpegRetriever(streamer)
109+
WebHandler.set_retriever(retriever)
52110

111+
# 开启http服务器
112+
HOST = 'localhost'
113+
PORT = 9000
114+
print('Start Server ... (http://%s:%s)' % (HOST, PORT))
115+
httpd = TCPServer((HOST, PORT), WebHandler)
116+
httpd.serve_forever()
53117

0 commit comments

Comments
 (0)