跳到正文

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 -version

macOS

brew install ffmpeg

Windows

winget install Gyan.FFmpeg      # 或:choco install ffmpeg  /  scoop install ffmpeg
# 然后打开一个新的终端让 PATH 刷新,并检查:
ffmpeg -version

yt-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 软件包都包含它。

相关指南