fluent-ffmpeg 获取编解码器数据而不指定输出

fluent-ffmpeg get codec data without specifying output

我正在使用 fluent-ffmpeg 节点模块从文件中获取编解码器数据。 如果我提供输出,它会起作用,但我想知道 运行 fluent-ffmpeg 是否有任何选项而不给它输出。 这就是我正在做的事情:

readStream.end(new Buffer(file.buffer));
var process = new ffmpeg(readStream);

process.on('start', function() {
  console.log('Spawned ffmpeg');
}).on('codecData', function(data) {
  //get recording duration
  const duration = data.duration;
  console.log(duration)
}).save('temp.flac');

如您所见,我正在将文件保存到 temp.flac,这样我就可以获得该文件的秒数持续时间。

如果您不想将 ffmpeg 处理结果保存到文件,想到的一件事是将命令输出重定向到 /dev/null

事实上,正如 fluent-ffmpeg 存储库的所有者在一个 comment 中所说,当使用 null 格式。

所以,例如,类似的东西会起作用:

let process = new ffmpeg(readStream);

process
  .addOption('-f', 'null')  // set format to null 
  .on('start', function() {
    console.log('Spawned ffmpeg');
  })
  .on('codecData', function(data) {
    //get recording duration
    let duration = data.duration;
    console.log(duration)
  })
  .output('nowhere')  // or '/dev/null' or something else
  .run()

它仍然有点老套,但我们必须设置一个输出以避免 "No output specified" 错误。

当不存在流参数时,pipe() 方法 returns 一个 PassThrough 流,您可以将其通过管道传输到其他地方(或者只是监听事件)。

var command = ffmpeg('/path/to/file.avi')
  .videoCodec('libx264')
  .audioCodec('libmp3lame')
  .size('320x240')
  .on('error', function(err) {
    console.log('An error occurred: ' + err.message);
  })
  .on('end', function() {
    console.log('Processing finished !');
  });

var ffstream = command.pipe();
ffstream.on('data', function(chunk) {
  console.log('ffmpeg just wrote ' + chunk.length + ' bytes');
});