diff options
| author | 8cy <[email protected]> | 2020-04-03 02:37:42 -0700 |
|---|---|---|
| committer | 8cy <[email protected]> | 2020-04-03 02:37:42 -0700 |
| commit | 60867fb030bae582082340ead7dbc7efdc2f5398 (patch) | |
| tree | 4c6a7356351be2e4914e15c4703172597c45656e /node_modules/prism-media/src/transcoders/ffmpeg/Ffmpeg.js | |
| parent | commenting (diff) | |
| download | s5nical-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.js | 56 |
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; |