@vikasietum_tecknology/record-rtc
Version:
record-rtc is a library based on recordrtc library. In this forked version of the original library we have optimized the memory management. The video recording is stored in IndexDB in chunks.
125 lines (99 loc) • 3.76 kB
JavaScript
// Last time updated at June 02, 2017
// Muaz Khan - www.MuazKhan.com
// MIT License - www.WebRTC-Experiment.com/licence
// RecordRTC - github.com/muaz-khan/RecordRTC
// RecordRTC over Socket.io - https://github.com/muaz-khan/RecordRTC/tree/master/RecordRTC-over-Socketio
var http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs"),
uuid = require('node-uuid'),
port = process.argv[2] || 9001;
console.log('http://localhost:' + port);
var app = http.createServer(function (request, response) {
var uri = url.parse(request.url).pathname,
filename = path.join(process.cwd(), uri);
fs.exists(filename, function (exists) {
if (!exists) {
response.writeHead(404, {
"Content-Type": "text/plain"
});
response.write('404 Not Found: ' + filename + '\n');
response.end();
return;
}
if (fs.statSync(filename).isDirectory()) filename += '/index.html';
fs.readFile(filename, 'binary', function (err, file) {
if (err) {
response.writeHead(500, {
"Content-Type": "text/plain"
});
response.write(err + "\n");
response.end();
return;
}
response.writeHead(200);
response.write(file, 'binary');
response.end();
});
});
}).listen(parseInt(port, 10));
var path = require('path'),
exec = require('child_process').exec;
var io = require('socket.io').listen(app);
io.sockets.on('connection', function (socket) {
socket.on('message', function (data) {
var fileName = uuid.v4();
socket.emit('ffmpeg-output', 0);
writeToDisk(data.audio.dataURL, fileName + '.wav');
// if it is chrome
if (data.video) {
writeToDisk(data.video.dataURL, fileName + '.webm');
merge(socket, fileName);
}
// if it is firefox or if user is recording only audio
else socket.emit('merged', fileName + '.wav');
});
});
// isn't it redundant?
// app.listen(8888);
function writeToDisk(dataURL, fileName) {
var fileExtension = fileName.split('.').pop(),
fileRootNameWithBase = './uploads/' + fileName,
filePath = fileRootNameWithBase,
fileID = 2,
fileBuffer;
// @todo return the new filename to client
while (fs.existsSync(filePath)) {
filePath = fileRootNameWithBase + '(' + fileID + ').' + fileExtension;
fileID += 1;
}
dataURL = dataURL.split(',').pop();
fileBuffer = new Buffer(dataURL, 'base64');
fs.writeFileSync(filePath, fileBuffer);
console.log('filePath', filePath);
}
function merge(socket, fileName) {
var FFmpeg = require('fluent-ffmpeg');
var audioFile = path.join(__dirname, 'uploads', fileName + '.wav'),
videoFile = path.join(__dirname, 'uploads', fileName + '.webm'),
mergedFile = path.join(__dirname, 'uploads', fileName + '-merged.webm');
new FFmpeg({
source: videoFile
})
.addInput(audioFile)
.on('error', function (err) {
socket.emit('ffmpeg-error', 'ffmpeg : An error occurred: ' + err.message);
})
.on('progress', function (progress) {
socket.emit('ffmpeg-output', Math.round(progress.percent));
})
.on('end', function () {
socket.emit('merged', fileName + '-merged.webm');
console.log('Merging finished !');
// removing audio/video files
fs.unlinkSync(audioFile);
fs.unlinkSync(videoFile);
})
.saveToFile(mergedFile);
}