【发布时间】:2014-04-27 23:54:50
【问题描述】:
我正在尝试使用 node.js 将来自 youtube 链接的音频直接流式传输到 http。
我的代码是这样的,我使用的是 express 4.0。
var express = require('express');
var router = express.Router();
var ytdl = require('ytdl');
var ffmpeg = require('fluent-ffmpeg');
var fs = require('fs');
router.get('/', function(req, res) {
var url = 'https://www.youtube.com/watch?v=GgcHlZsOgQo';
var video = ytdl(url)
res.set({
"Content-Type": "audio/mpeg"
})
new ffmpeg({source: video})
.toFormat('mp3')
.writeToStream(res, function(data, err) {
if (err) console.log(err)
})
});
module.exports = router;
现在,如果我保存文件然后将其通过管道传输到响应,我可以将视频的音频流式传输到响应,但我宁愿尝试找出从下载到 ffmpeg 到响应的某种方法。
不确定这是否可能。主要目标是使其重量尽可能轻,并且不必从文件中读取。
我已经看到this 代码,这基本上是我想要做的减去保存到文件部分的操作。
【问题讨论】:
-
这是完全可能的。你的代码不工作怎么办?我不熟悉
ytdl和fluent-ffmpeg,但我通过将FFmpeg 作为子进程运行并将结果直接传递给响应来完成类似的事情。需要考虑的一些事情...如果客户端比您从 FFmpeg 中获得的速度慢,您的服务器将在内存中缓冲。准备好为这样的服务器使用大量内存。您可能会考虑使用大型交换文件。此外,您的行为违反了 YouTube 服务条款。 -
我得到的错误只是一个空响应,当我发出请求时流正在关闭。
-
不过,我会调查 ffmpeg 子进程,谢谢。
-
不要使用 Chrome 进行测试。它会发出多个请求,因为它试图弄清楚如何处理您的媒体,以及它是否支持搜索。首先,确保您可以写入文件。接下来,确保您可以在服务器上使用 curl 或 wget。然后用像 VLC 这样的普通客户端进行测试。然后,弄清楚如何处理 Chrome。 (而且,来自 Chrome 等客户的请求是为什么您的方法可能不是最好的原因。您是否不想至少在磁盘上缓存一段时间的网站?)
-
可以写入文件。 Curl 正在工作,正在获取数据。最终我会把它用作一个小 api,所以不使用 chrome 是可以的。
标签: javascript node.js http ffmpeg mp3