我正在尝试通过直接视频网址加载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
的网址加载视频,它会加载并播放正常,并且设置持续时间/是可查找。有什么想法吗?
答案 0 :(得分:1)
在完成之前,无法知道输出大小和持续时间。在大多数情况下,FFmpeg无法提前知道此信息。即使它可以,你执行FFmpeg的方式也会阻止你访问额外的信息。
此外,为了支持寻求,您需要支持范围请求。这也是不可能的,如果没有将文件编码到请求的字节并从那里开始流式传输。
基本上,你所做的事情的性质是不可能的。