yt-dlp 进阶:视频下载与字幕提取实战
yt-dlp 的格式选择、字幕下载、元数据保留、批量任务、代理配置、限速策略与 Docker 部署,附 30 个生产环境实用命令。
yt-dlp 进阶:视频下载与字幕提取实战
yt-dlp 是 youtube-dl 的活跃分支,更新频率高、功能多、性能好。但它的命令行参数超过 600 个,新手看了直接劝退。这篇整理我常用的一些组合,按场景分类。
基础下载
最简单的下载命令:
yt-dlp https://www.youtube.com/watch?v=xxxxx
默认下载最高画质,文件名是 ${title}-${id}.${ext}。够用但不够好。
格式选择
yt-dlp 的格式选择是它最强的功能。-F 查看所有可用格式:
yt-dlp -F https://www.youtube.com/watch?v=xxxxx
输出会列出视频流、音频流、字幕流的 ID。然后用 -f 指定:
# 下载 1080p 视频 + 最佳音频,合并为 mp4
yt-dlp -f "bv*[height<=1080]+ba/b" --merge-output-format mp4 URL
# 仅下载 720p 以下的视频(流量敏感场景)
yt-dlp -f "bv*[height<=720]+ba/b" URL
# 仅下载音频(播客场景)
yt-dlp -f "ba" -x --audio-format mp3 --audio-quality 0 URL
# 下载特定编码(AV1 优先,省流量)
yt-dlp -f "bv*[vcodec=av01]+ba/b" URL
bv* 是 best video with optional codec,ba 是 best audio,/b 是 fallback 到 best single file。这种语法一开始看不懂,习惯之后就回不去了。
字幕下载
yt-dlp 的字幕功能很多人没用过,但其实是字幕组的核心工具之一:
# 列出所有可用字幕
yt-dlp --list-subs URL
# 下载中英双语字幕
yt-dlp --write-sub --sub-langs "zh-Hans,en" --embed-subs URL
# 仅下载字幕不下载视频
yt-dlp --write-sub --skip-download URL
# 下载自动字幕(YouTube 自动生成的)
yt-dlp --write-auto-subs --sub-langs "zh-Hans" URL
# 字幕格式优先级:ass > srt > vtt
yt-dlp --write-sub --sub-format "ass,srt,vtt" URL
--embed-subs 把字幕内嵌到视频文件里,需要 ffmpeg 支持。但内嵌字幕只能用播放器查看,编辑不了。所以做字幕工程时一般用 --write-sub 单独输出文件。
YouTube 自动字幕的质量近年提升很大,英文识别准确率能到 95% 以上,日文 85% 左右。如果素材没有人工字幕,自动字幕可以作为初稿用 VideoCaptioner 二次校对。
元数据保留
下载视频时把标题、描述、上传日期、缩略图一并保留:
yt-dlp \
--write-info-json \
--write-description \
--write-thumbnail \
--embed-thumbnail \
--add-metadata \
URL
--embed-thumbnail 把缩略图嵌入视频文件,--add-metadata 把标题、作者、日期写入视频元数据。这样在播放器里能看到完整信息。
批量下载
下载整个频道或播放列表:
# 下载整个播放列表
yt-dlp URL # URL 是播放列表链接
# 仅下载播放列表前 10 个
yt-dlp --playlist-items 1-10 URL
# 下载整个频道,跳过已下载的
yt-dlp --download-archive archive.txt URL
# 按日期过滤:只下载 2024 年以后的
yt-dlp --dateafter 20240101 URL
# 按标题过滤:只下载标题包含"教程"的
yt-dlp --match-title "教程" URL
--download-archive 是关键参数,记录已下载视频的 ID,重复运行不会重新下载。我有个频道订阅脚本每周跑一次,靠这个参数避免重复下载。
代理配置
国内访问 YouTube 必须用代理:
# 命令行指定
yt-dlp --proxy socks5://127.0.0.1:1080 URL
# 或环境变量
export HTTPS_PROXY=socks5://127.0.0.1:1080
yt-dlp URL
socks5:// 比 http:// 稳定,推荐。如果用 clash 之类的代理软件,把端口填进去就行。
限速策略
下载大视频时会占用整个带宽,影响其他工作。yt-dlp 支持限速:
# 限速 5MB/s
yt-dlp -r 5M URL
# 限速到带宽的 50%
yt-dlp -r "50%" URL
批量下载时配合 --sleep-requests 和 --sleep-interval 避免被风控:
yt-dlp \
--sleep-requests 2 \
--sleep-interval 5 \
--max-sleep-interval 10 \
URL
每两个请求间间隔 2 秒,每个视频下载前随机睡眠 5-10 秒。YouTube 不会把这种节奏识别为爬虫。
Docker 部署
服务器上跑 yt-dlp 用 Docker 最干净:
FROM python:3.12-slim
RUN apt-get update && apt-get install -y ffmpeg
RUN pip install yt-dlp
WORKDIR /work
VOLUME ["/work"]
ENTRYPOINT ["yt-dlp"]
构建:
docker build -t yt-dlp .
docker run --rm -v $(pwd):/work yt-dlp URL
挂载当前目录到容器 /work,下载的文件直接落在宿主机。配 cron 定时跑,就是一套自动视频采集系统。
30 个实用命令速查
# 1. 下载 1080p 视频
yt-dlp -f "bv*[height<=1080]+ba/b" URL
# 2. 下载最佳音频转 MP3
yt-dlp -x --audio-format mp3 --audio-quality 0 URL
# 3. 下载并嵌入字幕
yt-dlp --write-sub --sub-langs "zh-Hans,en" --embed-subs URL
# 4. 仅下载字幕
yt-dlp --write-sub --skip-download URL
# 5. 下载整个播放列表
yt-dlp --yes-playlist URL
# 6. 跳过已下载
yt-dlp --download-archive archive.txt URL
# 7. 限速下载
yt-dlp -r 5M URL
# 8. 用代理下载
yt-dlp --proxy socks5://127.0.0.1:1080 URL
# 9. 列出所有格式
yt-dlp -F URL
# 10. 列出所有字幕
yt-dlp --list-subs URL
# 11. 下载缩略图
yt-dlp --write-thumbnail URL
# 12. 嵌入缩略图
yt-dlp --embed-thumbnail URL
# 13. 写入元数据
yt-dlp --add-metadata URL
# 14. 按日期过滤
yt-dlp --dateafter 20240101 URL
# 15. 按标题过滤
yt-dlp --match-title "教程" URL
# 16. 按时长过滤(小于 10 分钟)
yt-dlp --match-filter "duration < 600" URL
# 17. 下载为指定格式(mp4)
yt-dlp --merge-output-format mp4 URL
# 18. 下载为指定编码(AV1)
yt-dlp -f "bv*[vcodec=av01]+ba/b" URL
# 19. 仅下载音频最高质量
yt-dlp -f "ba" URL
# 20. 下载字幕并转 SRT
yt-dlp --write-sub --convert-subs srt URL
# 21. 下载整个频道归档
yt-dlp --download-archive channel.txt URL
# 22. 列出播放列表所有视频标题
yt-dlp --flat-playlist --print "%(title)s" URL
# 23. 输出 JSON 元数据
yt-dlp --dump-json URL
# 24. 批量下载文件中的 URL
yt-dlp -a urls.txt
# 25. 模拟下载(仅测试)
yt-dlp --simulate URL
# 26. 查看可用格式 JSON
yt-dlp -J URL | jq '.formats[]'
# 27. 下载并切分(每 10 分钟一段)
yt-dlp --external-downloader ffmpeg \
--external-downloader-args "-segment_time 600 -f segment" URL
# 28. 用 cookies 下载会员内容
yt-dlp --cookies cookies.txt URL
# 29. 用浏览器 cookies
yt-dlp --cookies-from-browser chrome URL
# 30. 强制 IPv4
yt-dlp --force-ipv4 URL
这套命令列表我打印贴在显示器边上,每天看几十遍。
翻译理论札记
写到这里想插入一段翻译理论的思考。奈达的功能对等强调译文读者读到译文时的反应,应当与原文读者读到原文时的反应基本一致,这意味着翻译不是字面替换,而是要在目标语里重新构造等值效果。我们做字幕,观众在屏幕前只有几秒钟读完一行字,反应时间被严重压缩,所以功能对等在字幕里被推到了极端——可读性优先于忠实度。
纽马克的区分更实用:交际翻译关注译文效果,语义翻译关注原文意义。字幕绝大多数时候走交际翻译路线,但遇到关键术语、专有名词、文化负载词时又要切回语义翻译,避免观众被误导。这两条路线在字幕里不停切换,做久了会形成直觉。
韦努蒂的归化异化是另一条轴线。归化是让译文流畅得像目标语原创,异化是保留原文的陌生感。日漫字幕里大量保留"前辈""学园""王道"等词就是异化,因为这些词在中文语境里已经形成了稳定的亚文化共识,强行归化反而失味。但纪录片、欧美剧的台词又需要强归化,否则观众跳戏。题材决定策略,没有一招通吃的方案。
—— 这些理论看起来抽象,但实际做字幕时每天都在用,只是未必意识到。把直觉变成方法论,是新人到熟手的分水岭。