summaryrefslogtreecommitdiff
path: root/node_modules/prism-media/src/transcoders/ffmpeg/Ffmpeg.js
diff options
context:
space:
mode:
author8cy <[email protected]>2020-04-03 02:37:42 -0700
committer8cy <[email protected]>2020-04-03 02:37:42 -0700
commit60867fb030bae582082340ead7dbc7efdc2f5398 (patch)
tree4c6a7356351be2e4914e15c4703172597c45656e /node_modules/prism-media/src/transcoders/ffmpeg/Ffmpeg.js
parentcommenting (diff)
downloads5nical-60867fb030bae582082340ead7dbc7efdc2f5398.tar.xz
s5nical-60867fb030bae582082340ead7dbc7efdc2f5398.zip
2020/04/03, 02:34, v1.2.0
Diffstat (limited to 'node_modules/prism-media/src/transcoders/ffmpeg/Ffmpeg.js')
-rw-r--r--node_modules/prism-media/src/transcoders/ffmpeg/Ffmpeg.js56
1 files changed, 56 insertions, 0 deletions
diff --git a/node_modules/prism-media/src/transcoders/ffmpeg/Ffmpeg.js b/node_modules/prism-media/src/transcoders/ffmpeg/Ffmpeg.js
new file mode 100644
index 0000000..b34dadc
--- /dev/null
+++ b/node_modules/prism-media/src/transcoders/ffmpeg/Ffmpeg.js
@@ -0,0 +1,56 @@
+const ChildProcess = require('child_process');
+const FfmpegProcess = require('./FfmpegProcess');
+
+class FfmpegTranscoder {
+ constructor(mediaTranscoder) {
+ this.mediaTranscoder = mediaTranscoder;
+ this.command = FfmpegTranscoder.selectFfmpegCommand();
+ this.processes = [];
+ }
+
+ static verifyOptions(options) {
+ if (!options) throw new Error('Options not provided!');
+ if (!options.media) throw new Error('Media must be provided');
+ if (!options.ffmpegArguments || !(options.ffmpegArguments instanceof Array)) {
+ throw new Error('FFMPEG Arguments must be an array');
+ }
+ if (options.ffmpegArguments.includes('-i')) return options;
+ if (typeof options.media === 'string') {
+ options.ffmpegArguments = ['-i', `${options.media}`].concat(options.ffmpegArguments).concat(['pipe:1']);
+ } else {
+ options.ffmpegArguments = ['-i', '-'].concat(options.ffmpegArguments).concat(['pipe:1']);
+ }
+ return options;
+ }
+
+ /**
+ * Transcodes an input using FFMPEG
+ * @param {FfmpegTranscoderOptions} options the options to use
+ * @returns {FfmpegProcess} the created FFMPEG process
+ * @throws {FFMPEGOptionsError}
+ */
+ transcode(options) {
+ if (!this.command) this.command = FfmpegTranscoder.selectFfmpegCommand();
+ const proc = new FfmpegProcess(this, FfmpegTranscoder.verifyOptions(options));
+ this.processes.push(proc);
+ return proc;
+ }
+
+ static selectFfmpegCommand() {
+ try {
+ const ffmpegStatic = require('ffmpeg-static');
+ return ffmpegStatic.path || ffmpegStatic;
+ } catch (err1) {
+ try {
+ return require('ffmpeg-binaries');
+ } catch (err2) {
+ for (const command of ['ffmpeg', 'avconv', './ffmpeg', './avconv']) {
+ if (!ChildProcess.spawnSync(command, ['-h']).error) return command;
+ }
+ throw new Error('FFMPEG not found');
+ }
+ }
+ }
+}
+
+module.exports = FfmpegTranscoder;