FFmpeg从视频转换为音频丢失持续时间

时间:2014-12-09 23:02:33

标签: javascript node.js express ffmpeg

我正在尝试通过直接视频网址加载YouTube视频(使用ytdl-core检索)。我使用request库加载它们。然后我将结果传递给一个流,该流用作ffmpeg的输入(通过fluent-ffmpeg)。代码看起来像这样:

var getAudioStream = function(req, res) {
    var requestUrl = 'http://youtube.com/watch?v=' + req.params.videoId;
    var audioStream = new PassThrough();
    var videoUrl;

    ytdl.getInfo(requestUrl, { downloadURL: true }, function(err, info) {
      res.setHeader('Content-Type', 'audio/x-wav');
      res.setHeader('Accept-Ranges', 'bytes');
      videoUrl = info.formats ? info.formats[0].url : '';
      request(videoUrl).pipe(audioStream);

      ffmpeg()
        .input(audioStream)
        .outputOptions('-map_metadata 0')
        .format('wav')
        .pipe(res);
    });
  };

这实际上工作正常,并且前端成功接收WAV格式的音频并且可以播放。但是,音频缺少有关其大小或持续时间(以及所有其他元数据)的任何信息。这也使它无法实现。

我假设这在ffmpeg阶段失去了某些地方,因为如果我直接通过传递给request的网址加载视频,它会加载并播放正常,并且设置持续时间/是可查找。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在完成之前,无法知道输出大小和持续时间。在大多数情况下,FFmpeg无法提前知道此信息。即使它可以,你执行FFmpeg的方式也会阻止你访问额外的信息。

此外,为了支持寻求,您需要支持范围请求。这也是不可能的,如果没有将文件编码到请求的字节并从那里开始流式传输。

基本上,你所做的事情的性质是不可能的。