node.jsでインターネットにストリーミング配信
先日書いたRaspberryカメラストリーミングをインターネットに公開してみたいなぁと思いました。
RaspberryPi B+でカメラモジュール使ってnode.jsとsocket.ioでストリーミング配信してみる - 森川敬一 CTO ブログ
ローカルマシンなので簡単にグローバルに公開できません。
そこで公開サーバーを1台用意して、そことSocket.IOで中継してみました。
cliet.js
これを起動時に動かしてカメラ画像を公開サーバー(hogehoge)に転送します。
var express = require('express'); var app = express(); var fs = require('fs'); var path = require('path'); var spawn = require('child_process').spawn; var proc; var dateformat = require("dateformat"); app.use('/', express.static(path.join(__dirname, 'stream'))); var client = require('socket.io-client'); var socket = client.connect('http://hogehoge:3001'); socket.on('connect', function() { console.log('Connection - '); var args = ["-bm", "-w", "320", "-h", "240", "-o", __dirname + "/stream/image_stream.jpg", "-t", "999999999", "-tl", "500", "--nopreview"]; proc = spawn('raspistill', args); console.log('Watching for changes...'); fs.watchFile(__dirname+'/stream/image_stream.jpg', function(current, previous) { fs.readFile(__dirname+'/stream/image_stream.jpg', function(err, buf){ socket.emit('liveStream', { image: true, buffer: buf, time:dateformat(new Date(), "yyyy/mm/dd HH:MM:ss") }); console.log('emmit liveStewam 2 server'); }); }) });
サーバー側は、画像を受け取ってファイルに保管します。
同時に二つsocket.ioを使えれば、受け取りながら、配信も出来るので、
以前の配信の部分もくっつけてます。
//////////////////////////////////////////// http_rasp.listen(3001, function() { console.log('listening on *:3001'); }); io_rasp.on('connection', function(socket) { sockets[socket.id] = socket; console.log("Total clients connected[rasp] : ", Object.keys(sockets).length); socket.on('liveStream', function(data) { console.log("receive liveStream[rasp] : "); fs.writeFile(__dirname+'/stream/image_stream.jpg', data.buffer); }); socket.on('disconnect', function() { delete sockets[socket.id]; }); });
以前は、窓際だったんですが、席替えしたので、何映せてませんが、夜になると暗くなると思います(w
the view from my office
最後にソースをgithubにあげときました。
k1morikawa/RaspberryPI_LiveStreaming_2 · GitHub