如何使用ytdl-core在未下载时获取各分辨率视频的文件大小?
获取YouTube视频各分辨率文件大小(无需下载)
嘿,我来帮你搞定这个需求!你已经用ytdl-core的getInfo拿到了视频基础信息,接下来只要从返回的info对象里提取格式数据,就能轻松获取各分辨率对应的文件大小了。
核心思路
YouTube的视频流和音频流是分开存储的,ytdl-core返回的info.formats数组包含了所有可用的媒体格式。我们需要:
- 过滤出仅包含视频的格式(排除纯音频流)
- 按分辨率标签(
qualityLabel)分组,避免重复输出同一分辨率的不同编码版本 - 把字节数格式化成更易读的单位(比如MB)
修改后的完整代码
const ytdl = require("ytdl-core"); const url = 'https://www.youtube.com/watch?v=FOwXlANwerI'; ytdl.getInfo(url) .then(info => { console.log("Video Title : " + info.videoDetails.title); // 过滤出仅含视频的格式(不含音频) const videoOnlyFormats = info.formats.filter(format => format.hasVideo && !format.hasAudio); // 用对象存储各分辨率对应的文件大小,避免重复 const resolutionSizeMap = {}; videoOnlyFormats.forEach(format => { const resolution = format.qualityLabel; // 跳过没有分辨率标签的格式 if (!resolution) return; // 仅记录该分辨率的第一个有效大小(可根据需求调整逻辑,比如取最大/最小体积) if (!resolutionSizeMap[resolution]) { const bytes = parseInt(format.contentLength); // 转成MB并保留两位小数 const mbSize = (bytes / (1024 * 1024)).toFixed(2); resolutionSizeMap[resolution] = `${mbSize} MB (${bytes} bytes)`; } }); // 按你想要的格式输出 console.log("\n各分辨率文件大小:"); Object.entries(resolutionSizeMap).forEach(([res, size]) => { console.log(`${res}: ${size}`); }); }) .catch(err => { console.error("获取视频信息失败:", err); });
关键细节说明
format.hasVideo和format.hasAudio:用来区分纯视频、纯音频或者音视频合并的流(YouTube现在几乎没有合并流了)qualityLabel:直接返回"144p"、"240p"这种你需要的分辨率字符串contentLength:格式的字节大小,是字符串类型,需要转成数字后计算成更直观的MB单位- 用对象去重是因为同一个分辨率可能对应不同编码(比如AVC和VP9)的流,你可以根据需求调整逻辑,比如取体积最小的或者编码效率更高的版本
运行这段代码后,就能得到你想要的输出效果啦!
内容的提问来源于stack exchange,提问作者Farrel Athaillah
相关产品推荐
相关产品推荐

