Raspberry Piのカメラモジュールの映像をSocketIOで配信

ラズパイのカメラ買ったので動かした. Flaskも初めて使ったけど簡単で面白かった.

インストール・設定

sudo pip install Flask
sudo pip install flask-socketIO
raspi-config
#画面にしたがってカメラモジュールを有効化する

プログラム

picam2socketio.py

import threading
import picamera
from flask import Flask, render_template, request, Response
from flask.ext.socketio import SocketIO, emit

app = Flask(__name__)
socketio = SocketIO(app)

def camera_thread() :
  with picamera.PiCamera() as camera :
    camera.resolution = (480, 270)
    camera.framerate = 5
    time.sleep(2)
    camera.stream = io.BytesIO()
    for foo in camera.capture_continuous(camera.stream, "jpeg", use_video_port=True):
      camera.stream.seek(0)
      socketio.emit('jpeg', base64.b64encode(camera.stream.read()))
      camera.stream.seek(0)
      camera.stream.truncate()

@app.route('/')
def index() :
  return render_template("index.html")

if __name__ == "__main__" :
  t=threading.Thread(target=camera_thread)
  t.setDaemon(True)
  t.start()

  socketio.run(app, host="0.0.0.0")

templates/index.html

<!DOCTYPE HTML>
<!--
  index.html

  Author:   Hiromasa Ihara (miettal)
  URL:      http://miettal.com
  License:  MIT License
  Created:  2014-05-15
-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>picam2iosocket</title>
</head>
<body>
<img id="cam">
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script src="http:////cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.16/socket.io.min.js"></script>
<script>
$(function(){
  var socket = io.connect('http://'+document.domain+':'+location.port);

  socket.on('jpeg', function(message){
    var src = "data:image/jpeg;base64," + message;
    $("#cam").attr('src', src);
  });

});
</script>
</body>
</html>

おわり