Initial commit
This commit is contained in:
commit
84b3e8f1a7
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
/config.js
|
||||
/node_modules/
|
||||
*.sublime-workspace
|
80
capture.js
Normal file
80
capture.js
Normal file
@ -0,0 +1,80 @@
|
||||
var http = require('http');
|
||||
var fs = require('fs');
|
||||
var util = require('util');
|
||||
var Readable = require('stream').Readable;
|
||||
var FfmpegCommand = require('fluent-ffmpeg');
|
||||
|
||||
|
||||
var PushStream = function(options) { Readable.call(this, options); };
|
||||
util.inherits(PushStream, Readable);
|
||||
PushStream.prototype._read = function(n) { };
|
||||
|
||||
|
||||
module.exports =
|
||||
{
|
||||
start: function(camId, cam, now)
|
||||
{
|
||||
var timer = null;
|
||||
var req = null;
|
||||
|
||||
console.log('Starting FFmpeg');
|
||||
|
||||
var output = new PushStream();
|
||||
var command = new FfmpegCommand();
|
||||
command
|
||||
.input(output)
|
||||
.inputFormat('mjpeg')
|
||||
.inputOption('-use_wallclock_as_timestamps 1')
|
||||
.output('D:/Temp/' + camId + '.avi')
|
||||
.videoCodec('libx264')
|
||||
.outputFormat('avi')
|
||||
.run();
|
||||
|
||||
|
||||
var cleanup = function()
|
||||
{
|
||||
if (timer !== null)
|
||||
{
|
||||
clearTimeout(timer);
|
||||
timer = null;
|
||||
}
|
||||
|
||||
if (command !== null)
|
||||
{
|
||||
output.push(null);
|
||||
command = null;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
req = http.request(cam.url, function(res)
|
||||
{
|
||||
timer = setTimeout(function()
|
||||
{
|
||||
console.log('Timeout!');
|
||||
req.abort();
|
||||
|
||||
cleanup();
|
||||
}, cam.timeout);
|
||||
|
||||
res.on('data', function(chunk)
|
||||
{
|
||||
output.push(chunk);
|
||||
});
|
||||
|
||||
res.on('end', function()
|
||||
{
|
||||
console.log('End!');
|
||||
cleanup();
|
||||
});
|
||||
});
|
||||
|
||||
req.on('error', function(e)
|
||||
{
|
||||
console.log(e);
|
||||
cleanup();
|
||||
});
|
||||
|
||||
req.end();
|
||||
}
|
||||
};
|
21
config.sample.js
Normal file
21
config.sample.js
Normal file
@ -0,0 +1,21 @@
|
||||
var config = {};
|
||||
|
||||
config.port = 5705;
|
||||
config.defaultOutputBase = '/srv/cam/';
|
||||
config.defaultOutputFilename = 'YYYY-MM-DD HH.mm.ss <camId>.avi';
|
||||
config.defaultTimeout = 5000;
|
||||
|
||||
config.cams =
|
||||
{
|
||||
frontdoor:
|
||||
{
|
||||
url: 'http://10.138.1.10/videostream.cgi?user=viewer&pwd=verysecure',
|
||||
timeout: 5000,
|
||||
|
||||
outputBase: '/srv/www/publiccam/YYYY-MM-DD HH.mm.ss/',
|
||||
outputFilename: '<camId>.avi'
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
module.exports = config;
|
58
index.js
Normal file
58
index.js
Normal file
@ -0,0 +1,58 @@
|
||||
var config = require('./config');
|
||||
var capture = require('./capture');
|
||||
|
||||
var moment = require('moment');
|
||||
var express = require('express');
|
||||
var app = express();
|
||||
|
||||
|
||||
// Some sanity checking to avoid issues later on
|
||||
if (!config.cams)
|
||||
config.cams = [];
|
||||
|
||||
|
||||
app.get('/', function(req, res)
|
||||
{
|
||||
res.send(JSON.stringify(
|
||||
{
|
||||
status: 'running',
|
||||
cams: Object.keys(config.cams)
|
||||
}));
|
||||
});
|
||||
|
||||
|
||||
app.get('/capture', function(req, res)
|
||||
{
|
||||
var now = moment();
|
||||
var cams = [];
|
||||
|
||||
for (var camId in config.cams)
|
||||
{
|
||||
cams.push(camId);
|
||||
capture.start(camId, config.cams[camId], now);
|
||||
}
|
||||
|
||||
res.send(JSON.stringify(cams));
|
||||
});
|
||||
|
||||
|
||||
app.get('/capture/:camId', function(req, res)
|
||||
{
|
||||
var camId = req.params.camId;
|
||||
|
||||
if (config.cams.hasOwnProperty(camId))
|
||||
{
|
||||
capture.start(config.cams[camId], moment());
|
||||
res.send(JSON.stringify([camId]));
|
||||
}
|
||||
else
|
||||
{
|
||||
res.sendStatus(404);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
app.listen(config.port, function()
|
||||
{
|
||||
console.log('SecurityCam.js running on port ' + config.port);
|
||||
});
|
16
package.json
Normal file
16
package.json
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "securitycam.js",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"express": "^4.14.0",
|
||||
"fluent-ffmpeg": "^2.1.0",
|
||||
"moment": "^2.14.1"
|
||||
}
|
||||
}
|
8
securitycam.sublime-project
Normal file
8
securitycam.sublime-project
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"folders":
|
||||
[
|
||||
{
|
||||
"path": "."
|
||||
}
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue
Block a user