diff --git a/raspberry_pi_camera_streaming.py b/raspberry_pi_camera_streaming.py new file mode 100644 index 0000000..9b517b8 --- /dev/null +++ b/raspberry_pi_camera_streaming.py @@ -0,0 +1,137 @@ +# Source code from the official PiCamera package +# http://picamera.readthedocs.io/en/latest/recipes2.html#web-streaming + +import io +import picamera +import logging +import socketserver +from threading import Condition +from http import server + +PAGE="""\ + + + + + Raspberry Pi Camera | Survillance + + + + + + + + + + + + +
+
+ +
+
+
+ +
+
+
+ Refresh +
+
+
+
+
+ + +
+ +
+ + +""" + +class StreamingOutput(object): + def __init__(self): + self.frame = None + self.buffer = io.BytesIO() + self.condition = Condition() + + def write(self, buf): + if buf.startswith(b'\xff\xd8'): + # New frame, copy the existing buffer's content and notify all + # clients it's available + self.buffer.truncate() + with self.condition: + self.frame = self.buffer.getvalue() + self.condition.notify_all() + self.buffer.seek(0) + return self.buffer.write(buf) + +class StreamingHandler(server.BaseHTTPRequestHandler): + def do_GET(self): + if self.path == '/': + self.send_response(301) + self.send_header('Location', '/index.html') + self.end_headers() + elif self.path == '/index.html': + content = PAGE.encode('utf-8') + self.send_response(200) + self.send_header('Content-Type', 'text/html') + self.send_header('Content-Length', len(content)) + self.end_headers() + self.wfile.write(content) + elif self.path == '/stream.mjpg': + self.send_response(200) + self.send_header('Age', 0) + self.send_header('Cache-Control', 'no-cache, private') + self.send_header('Pragma', 'no-cache') + self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=FRAME') + self.end_headers() + try: + while True: + with output.condition: + output.condition.wait() + frame = output.frame + self.wfile.write(b'--FRAME\r\n') + self.send_header('Content-Type', 'image/jpeg') + self.send_header('Content-Length', len(frame)) + self.end_headers() + self.wfile.write(frame) + self.wfile.write(b'\r\n') + except Exception as e: + logging.warning( + 'Removed streaming client %s: %s', + self.client_address, str(e)) + else: + self.send_error(404) + self.end_headers() + +class StreamingServer(socketserver.ThreadingMixIn, server.HTTPServer): + allow_reuse_address = True + daemon_threads = True + +with picamera.PiCamera(resolution='640x480', framerate=24) as camera: + output = StreamingOutput() + #Uncomment the next line to change your Pi's Camera rotation (in degrees) + #camera.rotation = 90 + camera.start_recording(output, format='mjpeg') + try: + address = ('', 8000) + server = StreamingServer(address, StreamingHandler) + server.serve_forever() + finally: + camera.stop_recording() \ No newline at end of file