cut video to clips and then merge clips

cut video to clips and then merge clips

[{"id":"77de1242.7f835c","type":"function-npm","z":"2f73cdd.dbeac32","name":"proccess clips","func":"var base64 = require('file-base64');\nvar ffmpeg = require('fluent-ffmpeg');\nlet videoUrl = flow.get('videoUrl');\nlet videoClone = ('videoClone.mp4');\nvar fileExt = '.mp4';\nvar series = msg.payload;\nvar i = 0;\nvar len = series.length;\n\nfunction generateVideoCore(from, to) {\n  return new Promise(function(resolve, reject) {\n    generateVideov2(from, to).then(function() {\n      if (i === 0) {\n        mergeVideos(['test' + fileExt], 'output' + fileExt).then(function () {\n          cloneVideo('output' + fileExt, 'tmp' + fileExt).then(function () {\n            resolve('ok');\n          })\n        });\n      } else {\n        mergeVideos(['tmp' + fileExt, 'test' + fileExt], 'output' + fileExt).then(function () {\n          cloneVideo('output' + fileExt, 'tmp' + fileExt).then(function () {\n            resolve('ok');\n          })\n        });\n      }\n    });\n  });\n}\n\n\nfunction generateVideov2(from, to) {\n  return new Promise(function(resolve, reject) {\n    var formatFrom = new Date(from).toISOString().substr(11, 8);\n    var duration = (to - from) / 1000;\n\n    ffmpeg(videoClone) //./sos_4-16_anadarko.mp4\n    .setStartTime(formatFrom)\n    .setDuration(duration)\n    .output('test' + fileExt)\n\n    .on('end', function(err) {   \n      if(!err) {\n        resolve('ok');\n      }            \n    })\n    .on('error', function(err){\n      reject('error');\n    }).run();\n  });\n}\n\nfunction mergeVideos(videoNames, videoOut) {\n  return new Promise(function(resolve, reject) {\n    var mergedVideo = ffmpeg();\n    videoNames.forEach(function(videoName){\n      mergedVideo = mergedVideo.addInput(videoName);\n    });\n    mergedVideo.mergeToFile(videoOut, '/tmp/')\n    .on('end', function() {\n        node.error('merged');\n      resolve('ok');\n    })\n    .on('error', function(err) {\n      reject('err.message');\n    });\n  });\n}\n\nfunction cloneVideo(videoIn, videoOut) {\n  return new Promise(function(resolve, reject) {\n    ffmpeg(videoIn) //output.mp4\n    .clone()\n    .save(videoOut) //tmp.mp4\n    .on('end', function() {\n      resolve('ok');\n    })\n    .on('error', function(err) {\n      reject('err.message');\n    });\n  });\n}\n\nfunction recursive(from, to) {\n    node.error('merging');\n  generateVideoCore(from, to).then(function (data) {\n    i++;\n    if (i <= len - 1) {\n      recursive(series[i].startTimeMs, series[i].stopTimeMs);\n    } else {\n      base64.encode('output' + fileExt, function(err, base64String) {\n        msg.payload = base64String;\n        flow.set('video', base64String);\n        node.send(msg);\n      });\n    }\n  });\n}\ncloneVideo(videoUrl, videoClone).then(()=>{\n    recursive(series[i].startTimeMs, series[i].stopTimeMs);\n})\n","outputs":1,"noerr":0,"x":404.0173645019531,"y":326.0103940963745,"wires":[["ae623b1b.3aeb58","2e62b79f.d8afb8"]]}]

Flow Info

Created 6 years, 4 months ago
Rating: not yet rated

Owner

Actions

Rate:

Node Types

Other
  • function-npm (x1)

Tags

Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option