yt-dlp 与 ffmpeg:为什么需要它、如何安装,以及哪些命令会用到它
作者 Tunelio 团队发布于
没有 ffmpeg,yt-dlp 只能保存 YouTube 以单文件提供的内容 —— 通常是自带音频的 360p 或 720p。更高画质都是分离的视频流和音频流,必须由 ffmpeg 合并;每一次 MP3 或格式转换也都是 ffmpeg 的工作。安装一次,放进 PATH(或使用 --ffmpeg-location),“ffmpeg not found” 警告、缺失的 1080p 和失败的 -x 提取就都消失了。
ffmpeg 为 yt-dlp 做什么
- 合并:YouTube 以分离的纯视频和纯音频 DASH 流提供 1080p、1440p 和 4K。yt-dlp 下载两者,然后让 ffmpeg 把它们封装成一个 MP4 或 MKV。
- 提取音频:-x --audio-format mp3(或 m4a、opus、flac、wav)是由 ffmpeg 完成的转码或重封装。
- 后处理:嵌入缩略图和元数据、按章节分割、把 WebM 重封装为 MP4、修复容器问题,以及为某些网站下载 HLS/m3u8 流。
如果 yt-dlp 打印 “WARNING: ffmpeg not found” 或 “You have requested merging of multiple formats but ffmpeg is not installed”,它会悄悄降级为最佳单文件格式 —— 这就是许多人 “只能拿到 720p” 的原因。
安装 ffmpeg
Linux
sudo apt install ffmpeg # Debian / Ubuntu
sudo dnf install ffmpeg # Fedora(先启用 RPM Fusion)
sudo pacman -S ffmpeg # Arch
ffmpeg -versionmacOS
brew install ffmpegWindows
winget install Gyan.FFmpeg # 或:choco install ffmpeg / scoop install ffmpeg
# 然后打开一个新的终端让 PATH 刷新,并检查:
ffmpeg -versionyt-dlp 项目也发布自己的 ffmpeg 构建(GitHub 上的 yt-dlp/FFmpeg-Builds),带有针对少数边缘情况的补丁;对大多数用户来说发行版软件包就够了。yt-dlp 需要 ffmpeg 和 ffprobe 两个可执行文件 —— 上述每个软件包都包含两者。
告诉 yt-dlp ffmpeg 在哪里
# 如果 ffmpeg 不在 PATH 中(Windows 便携版、自定义位置):
yt-dlp --ffmpeg-location "C:\ffmpeg\bin" "URL"
yt-dlp --ffmpeg-location /opt/ffmpeg/bin/ffmpeg "URL"
# 写进 yt-dlp 配置文件永久生效(~/.config/yt-dlp/config 或 %APPDATA%\yt-dlp\config.txt):
--ffmpeg-location /opt/ffmpeg/bin--ffmpeg-location 接受包含 ffmpeg/ffprobe 的目录,或 ffmpeg 二进制本身的路径。用 yt-dlp -v 验证:调试头部会打印找到的 ffmpeg 版本,找不到则显示 “ffmpeg: none”。
会用到 ffmpeg 的命令
最佳画质 MP4(视频 + 音频合并)
# 最佳视频 + 最佳音频,合并为 MP4
yt-dlp -f "bv*+ba/b" --merge-output-format mp4 "https://youtu.be/dQw4w9WgXcQ"
# 偏好 H.264 + AAC,文件无需重新编码即可到处播放
yt-dlp -S "res:1080,vcodec:h264,acodec:m4a" --merge-output-format mp4 "URL"合并是重封装,不是重新编码:只需几秒,不损失画质。只有在你用 --recode-video 明确要求,或编解码器无法放进所选容器时才会重新编码(MP4 里放 VP9 可以;放 Opus 不行 —— 此时 yt-dlp 会回退到 MKV)。
提取音频
yt-dlp -x --audio-format mp3 --audio-quality 0 "URL" # MP3,最佳 VBR
yt-dlp -x --audio-format best "URL" # 保留原始 Opus/AAC,不转码嵌入缩略图和元数据
yt-dlp -x --audio-format mp3 --embed-thumbnail --embed-metadata "URL"截取片段
yt-dlp --download-sections "*00:01:00-00:02:30" -f "bv*+ba/b" "URL"yt-dlp 常见的 ffmpeg 错误
- 安装后仍 “ffmpeg not found” → 打开新终端(Windows 在启动时读取 PATH)或传入 --ffmpeg-location。
- “Postprocessing: Conversion failed!” → 通常是损坏的部分下载;删除 .part 文件重试,或更新 yt-dlp —— 旧构建会把损坏的分片交给 ffmpeg。
- 合并时 “ffmpeg exited with code 1” → 检查磁盘空间和输出目录是否可写;加 -v 运行以查看 ffmpeg 自己的 stderr。
- 装了 ffmpeg 仍没有 1080p → YouTube 没向你的客户端提供它;尝试另一个播放器客户端,或检查 PO token 警告(见 403 指南)。
- 非常旧的 ffmpeg(4.x 之前)→ 部分选项和编解码器会失败;请升级 —— yt-dlp 期望相对较新的构建。
Docker
FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg curl unzip \
&& pip install --no-cache-dir "yt-dlp[default]" \
&& curl -fsSL https://deno.land/install.sh | DENO_INSTALL=/usr/local sh
ENTRYPOINT ["yt-dlp"]如今容器要完整支持 YouTube 需要三样东西:yt-dlp、ffmpeg 和 JavaScript 运行时(Deno)。定期重建镜像 —— 见更新指南。
当你根本不想运行 ffmpeg 时
合并和转码是每次下载都要付出的 CPU;在服务用户的服务器上会迅速累积,而且又多了一个需要打补丁的二进制。托管 API 以一个签名 URL 返回已合并的 MP4 或现成的 MP3,你这边只剩一次 HTTP 请求。Tunelio 是我们自己的服务,请据此权衡 —— 本地使用时 ffmpeg 加 yt-dlp 才是正确的工具。新账号可获得 100 个免费额度。
来源
- yt-dlp README —— 依赖(ffmpeg/ffprobe)、后处理选项、--ffmpeg-location。
- yt-dlp/FFmpeg-Builds —— 项目打了补丁的 ffmpeg 构建。
- ffmpeg.org —— 官方下载与文档。
常见问题
yt-dlp 必须要 ffmpeg 吗?
运行本身不需要,但对 YouTube 实际上需要:720p 以上的一切和每次音频转换都要它。没有 ffmpeg 只能得到最佳单文件格式。
合并会降低画质吗?
不会。合并是重封装 —— 流被复制进新容器,不重新编码。只有转码(例如转成 MP3)才会损失质量。
yt-dlp 说找不到 ffmpeg,但明明装了 —— 为什么?
它不在 yt-dlp 能看到的 PATH 里(Windows 刚安装后、cron/Docker 中很常见)。打开新终端,或用 --ffmpeg-location 传入包含 ffmpeg.exe 的文件夹。
还需要 ffprobe 吗?
需要,yt-dlp 的某些后处理器会用到 ffprobe。每个标准 ffmpeg 软件包都包含它。