从ytdl core express下载的360 p以上视频中没有音频



我制作了一个api,可以从youtube链接的链接下载视频,但我无法下载音频高于360p格式的视频。它只下载视频,没有音频
有什么解决办法吗?

通常1080p或更好的视频没有音频编码。音频必须单独下载,并通过适当的编码库进行合并。ffmpeg是使用最广泛的工具,有许多Node.js模块可用。使用从ytdl.getInfo返回的格式化对象下载特定的流以组合以满足您的需求。看看https://github.com/fent/node-ytdl-core/blob/master/example/ffmpeg.js举个例子。

您可以指定视频质量

const video = ytdl('http://www.youtube.com/watch?v=e_RsG3HPpA0',{quality: 18});
video.on('progress', function(info) {
console.log('Download progress')
})
video.on('end', function(info) {
console.log('Download finish')
})
video.pipe(fs.createWriteStream('video.mp4'));

请通过此链接检查质量值的选项

如果您使用的是ytdl-core,那么问题出在itag和您需要的itag的可用性上。只有3个itag同时支持视频和音频,其余的itag只支持音频或视频。对于ytdl-core中的视频和音频,您需要特别检查URl是否支持720p或1080p。我创建了两个功能,可以为您提供很多帮助。您可以做的是简单地从index.html发送一个xmlhttprequest并等待链接响应,以便您或您的用户可以从该链接下载"fup90〃;意味着false url providedinc90表示不正确的URL,因此如果URL不是youtube URL,您可以处理错误。代码如下所示,请注意,您使用post方法发送了一个xmlhttpreqest,数据为json字符串,格式为var data = {downloadType:"audio"/"video",quality:"required itag",url:"youtube video url"}

const ytdl = require('ytdl-core');
const express = require('express');
const parser = require('body-parser');
const app = express();
app.use(parser.text());
app.use(express.static(__dirname + "\static"));
// video formats 18 - 360p and  22 - 720p
// audio
async function getAudioData(videoURL) {
let videoid = await ytdl.getURLVideoID(videoURL);
let info = await ytdl.getInfo(videoid);
// let format = ytdl.chooseFormat(info.formats, { quality: '134' }); for video
// var format = ytdl.filterFormats(info.formats, 'videoandaudio');
let format = ytdl.filterFormats(info.formats, 'audioonly');
let required_url = 0;
format.forEach(element => {
if (element.mimeType == `audio/mp4; codecs="mp4a.40.2"`) {
required_url = element.url;
}
});
return required_url;
}
async function getVideoData(videoURL, qualityCode) {
try {
let videoid = ytdl.getURLVideoID(videoURL);
let info = await ytdl.getInfo(videoid);
var ifExists = true;
if (qualityCode == 22) {
info.formats.forEach(element => {
if (element.itag == 22) {
qualityCode = 22;
} else {
qualityCode = 18;
ifExists = false;
}
});
}
let format = ytdl.chooseFormat(info.formats, { quality: qualityCode });
var answers = {
url: format.url,
exists: ifExists
}
} catch (e) {
var answers = {
url: "fup90",
exists: false
}
}
return answers;
}

app.get("/", (req, res) => {
res.sendFile(__dirname + "\index.html");
});
app.post("/getdownload", async(req, res) => {
let data = JSON.parse(req.body);
if (data.downloadType === "video") {
var answer = await getVideoData(data.url, data.quality);
if (answer.url === "fup90") {
res.send("inc90");
} else {
res.send(answer.exists ? answer.url : "xformat");
}
} else if (data.downloadType === "audio") {
var audioLink = await getAudioData(data.url);
res.send(audioLink);
} else {
res.send("error from server");
}
});

app.listen(8000, () => {
console.log("server started at http://localhost:8000");
});

最新更新