UNPKG

@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
// 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); }