summaryrefslogtreecommitdiff
path: root/node_modules/prism-media/src/transcoders/ffmpeg/Ffmpeg.js
blob: b34dadc38dba2bcee05f9d241259aa311dcccf7c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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;