我正在尝试使用'ytdl-core'和'fluent-ffmpeg'通过我的Node.js服务器将youtube视频转换为mp3。由于服务器打算同时处理多个请求,因此让我开始思考是否需要async.js以高效的方式转换视频。
然而,有趣的是,在使用async.js和不使用async.js的情况下测试多个请求的处理时,两种方法的结果似乎都是相同的-转换3个视频所需的时间是相同的。
这是我没有async.js时使用的代码:
server.get('/download/:id', (req, res) => {
const id = req.params.id;
let stream = ytdl(`https://www.youtube.com/watch?v=${id}`);
ffmpeg(stream)
.audioCodec('libmp3lame')
.audioBitrate(128)
.toFormat('mp3')
.save(`public/downloads/${id}.mp3`)
.on('error', err => {
console.log(err);
})
.on('end', () => {
console.log('file downloaded');
send(req, `public/downloads/${id}.mp3`).pipe(res);
});
});
这是使用async.js的代码:
let queue = async.queue((task, callback) => {
let stream = ytdl(`https://www.youtube.com/watch?v=${task.id}`);
ffmpeg(stream)
.audioCodec('libmp3lame')
.audioBitrate(128)
.toFormat('mp3')
.save(`public/downloads/${task.id}.mp3`)
.on('error', err => {
console.log(err);
callback(err)
})
.on('end', () => {
send(task.req, `public/downloads/${task.id}.mp3`).pipe(task.res);
callback('file sucessfully downloaded');
});
}, 5);
queue.drain = function() {
console.log('all items downloaded');
}
server.get('/download/:id', (req, res) => {
queue.push({req: req, id: req.params.id, res: res}, err => {
console.log(err);
});
});
有人知道为什么这两种方法似乎几乎同时完成转换吗?我可以想象,由于并行处理,使用async.js应该可以更快地完成视频的转换,但事实并非如此。
任何想法都将不胜感激!