森川敬一 CTO ブログ

unimediaでCTOやってます森川敬一です。エンジニアブログ。IoT、ウエアブルとか書いていきます。

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