Skip to content

Instantly share code, notes, and snippets.

@normanzb
Created April 9, 2012 10:00
Show Gist options
  • Save normanzb/2342656 to your computer and use it in GitHub Desktop.
Save normanzb/2342656 to your computer and use it in GitHub Desktop.
streaming server on ubuntu
// Original article http://delog.wordpress.com/2011/04/26/stream-live-webm-video-to-browser-using-node-js-and-gstreamer/
var express = require('express'),
net = require('net'),
child = require('child_process');
var app = express.createServer(), socket, header = [];
var server = net.createServer( function(s){
socket = s;
var onData = function(data){
if(header.length > 10){
socket.removeListener('data', onData)
return;
}
header.unshift(data);
};
var onClose = function(had_error){
};
socket.on('data', onData);
});
server.listen(function(){
console.log('internal server started at ' + server.address().port);
var args = [
'v4l2src',
'!', 'video/x-raw-rgb,framerate=30/1',
'!', 'ffmpegcolorspace',
'!', 'vp8enc', 'speed=2',
'!', 'queue2',
'!', 'm.', 'autoaudiosrc',
'!', 'audioconvert',
'!', 'vorbisenc',
'!', 'queue2',
'!', 'm.', 'webmmux', 'name=m', 'streamable=true',
'!', 'tcpclientsink', 'host=localhost', 'port=' + server.address().port
];
// gst-launch is in Ubuntu package gstreamer-tools
var gst_muxer = child.spawn('gst-launch', args, null);
gst_muxer.stderr.on('data', onSpawnError);
gst_muxer.on('exit', onSpawnExit);
});
app.get('/stream', function (req, res){
res.writeHead(200, {
'Date': (new Date()).toUTCString(),
'Connection': 'close',
'Cache-Control': 'private',
'Content-Type': 'video/webm'
});
if (!socket){
res.end();
}
for(var l = header.length; l--;){
res.write(header[l])
}
var onData = function(data){
res.write(data);
};
var onClose = function(had_error){
res.end();
};
socket.on('data', onData);
socket.on('close', onClose);
res.connection.on('close', function(){
socket.removeListener('data', onData);
socket.removeListener('close', onClose);
});
});
app.listen(9000);
var onSpawnError = function(data){
console.log(data.toString());
};
onSpawnExit = function(code){
if (code){
console.error('GStreamer error, exit code ' + code);
}
};
process.on('uncaughtException', function(err){
console.debug(err);
});
console.log('started');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment