使用场景

发布于 2026-05-27更新于 2026-07-15

检查 YouTube 视频是否包含上传字幕

使用 yt-dlp 区分 YouTube 视频的上传字幕与自动生成字幕,并通过 jq、grep 或自定义命令快速判断字幕状态。

通过 yt-dlp 可以区分以下两类字幕:

  • 上传字幕:位于 subtitles 字段中,通常由作者、频道或内容提供方提供;

  • 自动生成字幕:位于 automatic_captions 字段中,由 YouTube 自动语音识别或自动翻译生成;

注意:存在上传字幕并不代表字幕一定由作者手工制作。

例如,部分新闻视频的字幕可能来自节目源自带的 Closed Captions。

测试视频

有上传字幕:
https://www.youtube.com/watch?v=7ARBJQn6QkM
 
无上传字幕:
https://www.youtube.com/watch?v=SS5uEinPunc

查看字幕列表

yt-dlp \
  --js-runtimes node \
  --list-subs \
  "https://www.youtube.com/watch?v=7ARBJQn6QkM"

--list-subs 会分别输出:

Available automatic captions for ...

和:

Available subtitles for ...

前者是自动生成字幕,后者是上传字幕。

当输出中出现:

[info] Available subtitles for 7ARBJQn6QkM:
Language Name    Formats
en       English vtt, srt, ttml, srv3, srv2, srv1, json3

表示该视频存在语言代码为 en 的上传字幕。

当输出中出现:

SS5uEinPunc has no subtitles

表示该视频不存在上传字幕。

这不代表视频一定没有自动生成字幕;自动字幕需要查看 Available automatic captions 部分。

JavaScript 运行时

参数:

--js-runtimes node

表示允许 yt-dlp 使用 Node.js 执行 YouTube 的 JavaScript challenge solver。

使用该参数前,需要保证系统已安装兼容版本的 Node.js:

node --version

也可以使用其他受 yt-dlp 支持的 JavaScript 运行时。例如,已安装 Bun 时可以使用:

--js-runtimes bun

某些情况下不指定 --js-runtimes 仍然可以获取视频信息,但可能出现格式或功能缺失,因此不建议将其作为长期配置。

使用 jq 判断

--list-subs 可能输出大量自动生成和自动翻译字幕。需要在脚本中判断时,推荐读取 yt-dlp 输出的 JSON,而不是解析终端日志。

安装 jq

macOS:

brew install jq

判断是否存在上传字幕

yt-dlp \
  --js-runtimes node \
  --skip-download \
  --dump-single-json \
  "https://www.youtube.com/watch?v=7ARBJQn6QkM" \
| jq -r '
  if ((.subtitles // {}) | length) > 0 then
    "有上传字幕:" + ((.subtitles | keys) | join(", "))
  else
    "没有上传字幕"
  end
'

可能输出:

有上传字幕:en

这里读取的是:

subtitles

而不是:

automatic_captions

因此不会将 YouTube 自动生成或自动翻译的字幕误判为上传字幕。

使用 grep 判断

临时在 Shell 中检查时,也可以匹配 --list-subs 的输出:

output=$(
  yt-dlp \
    --js-runtimes node \
    --list-subs \
    "https://www.youtube.com/watch?v=7ARBJQn6QkM" \
    2>&1
)
 
if echo "$output" | grep -q "Available subtitles for"; then
  echo "有上传字幕"
else
  echo "没有上传字幕"
fi

这种方式依赖 yt-dlp 的终端输出文案,适合临时检查,不建议作为长期工作流的核心判断逻辑。

长期使用时,应优先解析 --dump-single-json 返回的 subtitles 字段。

创建自定义命令

可以将判断逻辑封装为一个全局可用的 Shell 命令。

创建脚本

创建文件:

~/MyFiles/bin/has-youtube-subs

内容如下:

#!/usr/bin/env bash
 
set -euo pipefail
 
if [[ $# -ne 1 ]]; then
  echo "用法:has-youtube-subs <YouTube URL>" >&2
  exit 1
fi
 
yt-dlp \
  --js-runtimes node \
  --skip-download \
  --dump-single-json \
  "$1" \
| jq -r '
  if ((.subtitles // {}) | length) > 0 then
    "有上传字幕:" + ((.subtitles | keys) | join(", "))
  else
    "没有上传字幕"
  end
'

增加执行权限

chmod +x ~/MyFiles/bin/has-youtube-subs

将脚本目录加入 PATH

打开:

vim ~/.zshrc

增加:

export PATH="$HOME/MyFiles/bin:$PATH"

使配置立即生效:

source ~/.zshrc

执行命令

has-youtube-subs \
  "https://www.youtube.com/watch?v=7ARBJQn6QkM"

输出:

有上传字幕:en

该命令加入 PATH 后,可以在任意目录中执行。

在 YouTube 网页中判断

打开视频播放器,依次点击:

Settings(齿轮)
→ Subtitles/CC

出现:

English

通常表示该轨道不是 YouTube 自动生成字幕。

出现:

English (auto-generated)

则明确表示该字幕由 YouTube 的自动语音识别系统生成。

需要注意:

English

只能说明它不是标记为 auto-generated 的字幕轨道,不能据此断定字幕一定由视频作者手工制作。