FFmpeg 从视频转换为音频缺少持续时间

FFmpeg converting from video to audio missing duration

本文关键字:持续时间 音频 视频 转换 FFmpeg      更新时间:2023-09-26

我正在尝试通过他们的直接视频URL加载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的 URL 加载视频,它会加载并播放正常,并且具有设定的持续时间/可搜索。有什么想法吗?

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

此外,要支持搜索,您需要支持范围请求。 这也是不可能的,除非将文件编码到请求的字节并从那里流式传输。

基本上,根据您正在做的事情的性质,这是不可能的。