Node.js ищет аудио файл wav с помощью ffmpeg - PullRequest
0 голосов
/ 26 апреля 2019

Я использую ffprobe для поиска позиции на mp3-файлах, и это работает нормально. Вот как я делаю это в своей оболочке ffprobe node.js:

seek = function (fpath, seconds) {
      var self = this;
      return new Promise((resolve, reject) => {
        //ffprobe -i /myfile.mp3 -show_frames -show_entries frame=pkt_pos -of default=noprint_wrappers=1:nokey=1 -hide_banner -loglevel panic -read_intervals 20%+#1
        var loglevel = self.logger.isDebug() ? 'debug' : 'panic';
        const args = [
          '-hide_banner',
          '-loglevel', loglevel,
          '-show_frames',//Display information about each frame
          '-show_entries', 'frame=pkt_pos',// Display only information about byte position
          '-of', 'default=noprint_wrappers=1:nokey=1',//Don't want to print the key and the section header and footer
          '-read_intervals', seconds + '%+#1', //Read only 1 packet after seeking to position 01:23
          '-print_format', 'json',
          '-v', 'quiet',
          '-i', fpath
        ];
        const opts = {
          cwd: self._options.tempDir
        };
        const cb = (error, stdout) => {
          if (error)
            return reject(error);
          try {
            const outputObj = JSON.parse(stdout);
            return resolve(outputObj);
          } catch (ex) {
            self.logger.error("seek failed %s", ex);
            return reject(ex);
          }
        };
        cp.execFile('ffprobe', args, opts, cb)
          .on('error', reject);
      });
    }//seek

Таким образом, чтобы найти указанную startTime позицию в секундах, вы делаете

seek(path,startTime)

и тогда вы получите эквивалент в байтах, смотрящий на пакет первых кадров в frames, например:

position  = function() {
      if(this.raw.frames) {
        if(this.raw.frames.length>0) {// get first stream ref
          if(this.raw.frames[0].pkt_pos) {// get first stream ref
            return this.raw.frames[0].pkt_pos;
          }
        }
      }
      return '';
    }//position

Итак, при поиске файла mp3 все работает нормально, а запрос диапазона -

rangeBytes bytes=80685-8000685 {
  "url": "",
  "path": "",
  "raw": {
    "frames": [
      {
        "pkt_pos": "80685"
      }
    ]
  }
} {
  "url": "",
  "path": "",
  "raw": {
    "frames": [
      {
        "pkt_pos": "8000685"
      }
    ]
  }
}

проблема в том, что когда я использую это для файла wave, получаемый запрос диапазона для файла wave:

rangeBytes bytes=768058-76800058 {
  "url": "",
  "path": "",
  "raw": {
    "frames": [
      {
        "pkt_pos": "768058"
      }
    ]
  }
} {
  "url": "",
  "path": "",
  "raw": {
    "frames": [
      {
        "pkt_pos": "76800058"
      }
    ]
  }
}

не будет работать в стандартном аудиоплеере HTML5.

Примечание Команда ffprobe командной строки, которую я использую с оберткой выше, была:

ffprobe -i /myfile.mp3 -show_frames -show_entries frame=pkt_pos -of default=noprint_wrappers=1:nokey=1 -hide_banner -loglevel panic -read_intervals 20%+#1

Я предполагаю, что это относится как к mp3, так и к wave файлам.

...