Skip to content

Commit

Permalink
Release
Browse files Browse the repository at this point in the history
  • Loading branch information
agsh committed Mar 31, 2015
1 parent 8c9f84a commit 9a4f0fa
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 5 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,4 @@ node_modules
.lock-wscript

.idea
example2
105 changes: 105 additions & 0 deletions example/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
select {
display: block;
}
#container > div {
border: 1px solid black;
}
</style>
</head>
<body>

<div id="container"></div>
<button id="add">+</button>

<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io('');
socket.on('start', function(cou) {
var container = document.getElementById('container');
document.getElementById('add').onclick = function() {
var divSocket
, div = document.createElement('div')
;
var html = '<select><option value="/">select cam</option>';
for (var i = 0; i < cou; i++) {
html += '<option value="/cam' + i + '">Cam ' + i + '</option>';
}
html += '</select>';
html += '<img>';
div.innerHTML = html;
var image = div.getElementsByTagName('img')[0], select = div.getElementsByTagName('select')[0];
select.onchange = function() {
if (divSocket) {
divSocket.disconnect();
}
divSocket = io(this.value).connect();
divSocket.on('data', function(data) {
var bytes = new Uint8Array(data);
image.src = 'data:image/jpeg;base64,' + base64ArrayBuffer(bytes);
});
};
container.appendChild(div);
};
});

function base64ArrayBuffer(arrayBuffer) {
var base64 = '';
var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

var bytes = new Uint8Array(arrayBuffer);
var byteLength = bytes.byteLength;
var byteRemainder = byteLength % 3;
var mainLength = byteLength - byteRemainder;

var a, b, c, d;
var chunk;

// Main loop deals with bytes in chunks of 3
for (var i = 0; i < mainLength; i = i + 3) {
// Combine the three bytes into a single integer
chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];

// Use bitmasks to extract 6-bit segments from the triplet
a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18
b = (chunk & 258048) >> 12; // 258048 = (2^6 - 1) << 12
c = (chunk & 4032) >> 6; // 4032 = (2^6 - 1) << 6
d = chunk & 63; // 63 = 2^6 - 1

// Convert the raw binary segments to the appropriate ASCII encoding
base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d];
}

// Deal with the remaining bytes and padding
if (byteRemainder == 1) {
chunk = bytes[mainLength];

a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2

// Set the 4 least significant bits to zero
b = (chunk & 3) << 4; // 3 = 2^2 - 1

base64 += encodings[a] + encodings[b] + '==';
} else if (byteRemainder == 2) {
chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1];

a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10
b = (chunk & 1008) >> 4; // 1008 = (2^6 - 1) << 4

// Set the 2 least significant bits to zero
c = (chunk & 15) << 2; // 15 = 2^4 - 1

base64 += encodings[a] + encodings[b] + encodings[c] + '=';
}

return base64;
}

</script>
</body>
</html>
50 changes: 50 additions & 0 deletions example/server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/**
* Created by Andrew D.Laptev<[email protected]> on 30.03.15.
*/

const app = require('express')()
, server = require('http').Server(app)
, io = require('socket.io')(server)
, rtsp = require('../lib/rtsp-ffmpeg')
;

server.listen(6147);

var cams = [
'rtsp://r3---sn-5hn7su76.c.youtube.com/CiILENy73wIaGQnup-1SztVOYBMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp'
, 'rtsp://192.168.68.111/h264main'
, 'rtsp://r1---sn-5hn7su76.c.youtube.com/CiILENy73wIaGQn8uA5p5adowhMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp'
].map(function(uri, i) {
var stream = new rtsp.FFMpeg({input: uri});
stream.on('start', function() {
console.log('stream ' + i + ' started');
});
stream.on('stop', function() {
console.log('stream ' + i + ' stopped');
});
return stream;
});

cams.forEach(function(camStream, i) {
var ns = io.of('/cam' + i);
ns.on('connection', function(wsocket) {
console.log('connected to /cam' + i);
var pipeStream = function(data) {
wsocket.emit('data', data);
};
camStream.on('data', pipeStream);

wsocket.on('disconnect', function() {
console.log('disconnected from /cam' + i);
camStream.removeListener('data', pipeStream);
});
});
});

io.on('connection', function(socket) {
socket.emit('start', cams.length);
});

app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});
10 changes: 6 additions & 4 deletions lib/rtsp-ffmpeg.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const spawn = require('child_process').spawn
* @param {object} options
* @param {string} options.input Stream uri, for example rtsp://r3---sn-5hn7su76.c.youtube.com/CiILENy73wIaGQnup-1SztVOYBMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
* @param {number} [options.rate] Framerate
* @param {string} [options.resolution] Resolution in WxH format
* @param {string} [options.quality] JPEG quality
* @constructor
*/
Expand All @@ -22,7 +23,7 @@ var FFMpeg = function(options) {
throw new Error('no `input` parameter');
}
this.rate = options.rate || 10;
this.resolution = options.resolution || '720x576';//;'vga';
this.resolution = options.resolution;
this.quality = options.quality || '3';

this.on('newListener', newListener.bind(this));
Expand Down Expand Up @@ -60,13 +61,14 @@ FFMpeg.prototype._args = function() {
, '-i', this.input
, '-r', this.rate
//, '-vf', 'fps=25'
, '-s', this.resolution
, '-q:v', this.quality
].concat(
this.resolution ? ['-s', this.resolution] : []
, ['-q:v', this.quality
//, '-b:v', '32k'
, '-f', 'image2'
, '-updatefirst', '1'
, '-'
];
]);
};

/**
Expand Down
11 changes: 10 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,14 @@
"version": "0.0.1",
"author": "Andrew D.Laptev <[email protected]>",
"description": "ffmpeg wrapper for rtsp streaming",
"main": "lib/rtsp-ffmpeg.js"
"main": "lib/rtsp-ffmpeg.js",
"keywords": [
"rtsp",
"ffmpeg",
"mjpeg",
"motionjpeg"
],
"devDependencies": {
"socket.io": "^1.3.0"
}
}

0 comments on commit 9a4f0fa

Please sign in to comment.