И как модератор
1. Научить ноду более тщательно отслеживать падение ffmpeg;
2. ffmpeg не закрывается даже если нет камеры, а когда она подключена - продолжает запись.
let child_process = require('child_process'),
winston = require('../../config/winston')({filePath: 'log/ffmpeg.log', label: "develop"});
/**
* Сервис приема и декодирования RTS потока от видеорегистратора,
* и отправка его по потоку на указанный адрес.
* @param options
* ip_out - адрес, на котором находится приемник декодированного потока
* url - адрес расположения rtsp вешателя
* port_out - принимающий порт
* serverNumber - порядковый номер сервера, на котором запускается данный сервис
* @constructor
*/
function CreateFFMpegStream(options) {
this.url = options.url;
this.options = options;
this.ip_out = options.ip_out || '127.0.0.1';
this.port_out = options.port_out;
this.secret = options.secret;
this.serverNumber = options.serverNumber;
this.createStream();
}
CreateFFMpegStream.prototype.createStream = function() {
winston.info(`FFMpeg ['${this.serverNumber}'] stream was started.`);
this.out_url = `http://${this.ip_out}:${this.port_out}/${this.secret}`;
this.ffmpeg_stream = child_process.spawn('ffmpeg', ["-rtsp_transport", "tcp", "-i", this.url, '-f', 'mpegts', '-codec:v', 'mpeg1video', '-r', '30', '-b:v', '800k', this.out_url], {cwd: __dirname}); //убрал декодировку видео '-codec:a', 'mp2', '-ar', '44100',
this.ffmpeg_stream.stderr.addListener('data', function(data) {
});
};
CreateFFMpegStream.prototype.closeStream = function() {
this.ffmpeg_stream.kill()
};
exports.FFMpegStream = CreateFFMpegStream;
// HTTP Server to accept incomming MPEG-TS Stream from ffmpeg
let streamServer = http.createServer( function(request, response) {
let params = request.url.substr(1).split('/');
winston.info('HTTP Server ['+ SERVNUMBER +'] to accept incomming MPEG-TS Stream from ffmpeg started.');
if (params[0] !== STREAM_SECRET) {
winston.warn('Failed Stream Connection ['+ SERVNUMBER +']: '+ request.socket.remoteAddress + ':' + request.socket.remotePort + ' - wrong secret.');
response.end();
}
response.connection.setTimeout(0);
winston.info(
'Stream Connected: ' +
request.socket.remoteAddress + ':' +
request.socket.remotePort
);
request.on('data', function(data){
socketServer.broadcast(data);
if (request.socket.recording) {
request.socket.recording.write(data);
}
});
request.on('end',function(){
winston.info('Close stream.');
if (request.socket.recording) {
request.socket.recording.close();
}
});
// Record the stream to a local file?
if (RECORD_STREAM) {
let path = 'recordings/' + "-" + SERVNUMBER+ "-"+ Date.now() + '.ts';
request.socket.recording = fs.createWriteStream(path);
}
}).listen(STREAM_PORT);
ffmpeg = new FFMpeg_relay({
url: 'rtsp://<--тут лежит ваш url к камере с даннами логина-пароля-->&channel=' + CHANNEL + '&stream=0.sdp',
ip_out: '127.0.0.1', // адрес, на который будет потправляться декодированные части видео
port_out: STREAM_PORT,
secret: STREAM_SECRET,
serverNumber: SERVNUMBER
});
request.on('data', function(data){
socketServer.broadcast(data);
if (request.socket.recording) {
request.socket.recording.write(data);
}