You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用ytdl-core在未下载时获取各分辨率视频的文件大小?

获取YouTube视频各分辨率文件大小(无需下载)

嘿,我来帮你搞定这个需求!你已经用ytdl-core的getInfo拿到了视频基础信息,接下来只要从返回的info对象里提取格式数据,就能轻松获取各分辨率对应的文件大小了。

核心思路

YouTube的视频流和音频流是分开存储的,ytdl-core返回的info.formats数组包含了所有可用的媒体格式。我们需要:

  1. 过滤出仅包含视频的格式(排除纯音频流)
  2. 按分辨率标签(qualityLabel)分组,避免重复输出同一分辨率的不同编码版本
  3. 把字节数格式化成更易读的单位(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:10:40