开源视频下载工具链:yt-dlp、FFmpeg与m3u8合并实践
2026/9/1 2:15:40 网站建设 项目流程

这次整理的不是某一个软件,而是一条完整可用的视频下载工具链。主要覆盖四类需求:下载平台视频、下载 m3u8 流媒体、把断断续续的分片合并成完整文件、通过接口做批量下载。配套工具完全免费,核心是 yt-dlp、N_m3u8DL-RE、FFmpeg 这三个开源项目,再加一段可选的本地 API 封装脚本。

先快速判断这篇文章适不适合你:如果你的目标是保存自己拍摄的素材、备份已购买课程的离线视频、在授权场景下下载自己的创作内容,那这套方案值得收藏;如果想绕过付费、盗用他人版权内容,那这些工具不应该这么用,本文也不提供绕过授权限制的方法。后面会给出安装步骤、命令、批量任务脚本和常见报错排查,全部基于命令行,适合有一定技术基础、愿意动手配置的读者。

这次整理的重点不是某个图形界面,而是把命令行工具串起来:先用下载器拿到视频流,再用 FFmpeg 合并转码,最后通过脚本或 API 统一管理。整个流程可以在 Windows、macOS、Linux 上跑,不下载的时候不占后台资源,下载时资源占用主要取决于并发数和视频流格式。先看核心能力速览,再逐个展开部署步骤。

1. 核心能力速览

工具类型开源支持平台核心能力适合场景
yt-dlp视频下载器Windows / macOS / Linux解析网页视频流,支持批量、断点续传、格式选择平台视频、公开网页视频、批量备份
FFmpeg多媒体处理工具Windows / macOS / Linux合并分片、转码、抽音频、切片m3u8 合并、格式转换、音视频处理
N_m3u8DL-REm3u8 流下载器Windows / macOS / Linux解析 m3u8、多线程分片下载、自动合并网页直播回放、分段流媒体下载
lux视频下载器Windows / macOS / Linux单命令下载,支持 B 站等多平台快速下载、脚本调用
gallery-dl图集/视频下载器Windows / macOS / Linux批量抓取图集和视频素材采集、个人归档
浏览器扩展页面媒体嗅探大部分开源各浏览器识别页面中的视频地址临时下载,不适用批量任务

从表格可以看出,这套方案的核心是“命令行 + 开源工具”,不是单纯靠某个一键下载器,而是把解析、下载、合并、批量任务拆成几个环节,每个环节都有可替代的工具。这样做的优势在于,就算某个平台改版导致单一工具失效,也可以换另一个解析器继续用,不需要重新学习一套图形界面。

2. 免费视频下载工具横向对比

先说 yt-dlp。它是目前开源社区里维护最活跃的视频下载项目之一,支持非常多的平台。它最大的价值不是下载速度,而是解析能力:你只需要给一个页面链接,它会自动找到页面里的视频流、音频流、字幕和封面,然后按画质选择下载。它的批量能力也强,可以直接读取一个文本文件,逐条下载。对于需要备份自己上传内容、或者下载公开授权视频的人来说,yt-dlp 是首选。

再说 N_m3u8DL-RE。很多网页不直接给你一个 mp4 地址,而是给一个 m3u8 播放列表,这种格式常见于直播回放、在线课程和短视频平台。m3u8 里面是一串 TS 分片地址,浏览器播放器会一个一个拉取。N_m3u8DL-RE 做的事就是把这些分片按顺序下载到本地,然后合并成一个完整文件。它比直接使用 FFmpeg 下载更稳,因为它是专门为 m3u8 分片下载设计的,支持多线程、重试和进度显示。

FFmpeg 是整条链路里的基础工具。即使你不单独下载视频,只要用到 yt-dlp 或者 N_m3u8DL-RE,后面合并音视频流、重新封装格式、抽取音频,通常都需要 FFmpeg。它不是一个下载器,而是一个通用多媒体处理工具。建议一开始就把 FFmpeg 装好,并把可执行文件加入系统路径,这样后续所有工具都能自动调用它。

如果只是要快速下载某个单视频,lux 或者 gallery-dl 可以作为补充。lux 的命令更短,适合交互式使用,比如在终端里粘贴一个链接就下载。gallery-dl 更适合素材采集,比如批量下载某个图集里的图片和视频。这两个工具覆盖的场景相对窄,不是必须安装,但在某些平台解析失败时可以作为备用方案。

浏览器扩展适合轻度用户。安装扩展后,打开视频页面,扩展会尝试识别页面里的视频地址,然后一键下载。这类扩展的优点是方便,缺点是很多扩展会捆绑广告、上传用户浏览数据、或者不支持批量任务。如果只是偶尔下载一个视频,可以试;如果要做批量下载或接口集成,还是用命令行工具更可靠。

3. 部署环境与基础工具安装

3.1 Windows 环境

Windows 上建议直接下载 FFmpeg 和 yt-dlp 的可执行文件。

FFmpeg 的安装方式不复杂:去 ffmpeg.org 下载对应系统的 release build,解压后把bin目录加入系统环境变量Path。完成之后,打开新的终端窗口,输入ffmpeg -version,如果能看到版本信息,就说明安装成功。

yt-dlp 在 Windows 上有两种安装方式。一种是直接下载yt-dlp.exe,放到一个固定目录,比如D:\Tools,也把这个目录加入Path。另一种是使用 Python 安装,先装 Python,再执行:

pip install -U yt-dlp

N_m3u8DL-RE 也是绿色可执行程序,下载后解压运行即可。建议把三样工具放到同一个目录,比如D:\Tools\bin,管理起来更方便。

3.2 Linux 环境

Linux 下用包管理器安装最省事。Debian / Ubuntu 系列可以执行:

sudo apt update sudo apt install -y ffmpeg python3 python3-pip pip install -U yt-dlp

如果不想用 pip,也可以直接下载预编译的 yt-dlp 二进制文件放到/usr/local/bin,然后加执行权限。N_m3u8DL-RE 在 GitHub Releases 页面提供 Linux 版本,下载后解压,同样放到/usr/local/bin

安装完之后,建议逐个验证一下:

ffmpeg -version yt-dlp --version

这一步很重要。很多后续问题都是因为 FFmpeg 没有正确安装,导致音视频合并失败。

3.3 macOS 环境

macOS 上如果装了 Homebrew,可以这样装:

brew install ffmpeg yt-dlp python

N_m3u8DL-RE 提供 macOS 版本,下载后放到/usr/local/bin。如果没有 Homebrew,也可以直接下载二进制文件,手动加入路径,整体思路和 Windows 一致。

4. yt-dlp 使用与批量下载

4.1 基础下载命令

yt-dlp 的基本用法非常直接。先看目标页面支持哪些格式和画质,再选择下载。

查看格式:

yt-dlp -F "https://example.com/watch?v=123456"

输出结果里会列出视频流和音频流的编号,比如136是 1080p 视频流,140是 m4a 音频流。接下来可以指定编号下载:

yt-dlp -f "136+140" --merge-output-format mp4 "https://example.com/watch?v=123456"

如果你想省心一点,不关心具体编号,可以直接让 yt-dlp 自动选择最佳视频和最佳音频:

yt-dlp -f "bv*+ba/b" -o "%(title)s.%(ext)s" "https://example.com/watch?v=123456"

这里bv*表示最佳视频流,ba表示最佳音频流,/b表示如果不存在分离的音视频流,就退而求其次下载单个文件。-o指定输出文件名,%(title)s是 yt-dlp 的模板语法,会自动替换成视频标题。

4.2 保存列表和断点续传

有些平台会把视频列表放在一个播放列表页面,yt-dlp 支持直接下载整个列表。最稳妥的方式是先把所有链接保存到一个文本文件里,例如links.txt,每行一个 URL:

yt-dlp -f "bv*+ba/b" -a links.txt -o "%(title)s.%(ext)s"

批量任务建议加上断点续传参数-c,这样某个视频中途失败,下次重新运行时不会从头开始:

yt-dlp -f "bv*+ba/b" -c -a links.txt -o "%(title)s.%(ext)s"

如果下载的是自己已登录平台可见的私有视频,可能需要在命令里带上 Cookie 文件。这里需要特别提醒:Cookie 包含你的登录凭证,不要把它写进公共脚本,也不要分享给任何人。具体生成 Cookie 文件的方式因浏览器而异,建议只在本地使用。

4.3 只下载音频或字幕

yt-dlp 也可以当作音频下载器用。比如只想保存某个视频的音频:

yt-dlp -f "ba/b" -x --audio-format mp3 "https://example.com/watch?v=123456"

-x表示提取音频,--audio-format mp3表示转成 MP3。如果源视频的音频本来就是 m4a 或者 webm,转码过程依赖 FFmpeg。想下载字幕时,可以加:

yt-dlp --write-subs --sub-langs "zh-Hans,en" --skip-download "https://example.com/watch?v=123456"

这个命令只下载字幕,不下载视频,适合做字幕校对和本地归档。

5. m3u8 流媒体下载与视频合并

5.1 从页面中找到 m3u8 地址

很多网页和微信视频号视频并不直接暴露 mp4 地址,播放器拿到的是一个 m3u8 索引文件。找到这个地址,是下载这类视频的关键一步。

通用思路是这样的:在浏览器或已登录的客户端中打开目标视频,进入开发者工具的网络面板,刷新播放页面,筛选m3u8mpd关键字。播放器开始播放后,网络面板里会出现若干条类型为mediafetch的请求,其中带index.m3u8playlist.m3u8stream.m3u8字样的就是播放列表地址。把这条 URL 复制出来,就可以交给专用下载器。

这里必须强调:整个操作只适用于你有权访问、且内容允许下载的场景。如果视频源是加密的,或者页面明确提示不允许下载,不应该使用破解或绕过手段。加密分片不是普通工具能处理的,继续尝试没有意义,还可能涉及版权和安全风险。

5.2 使用 N_m3u8DL-RE 下载

拿到 m3u8 地址后,执行:

N_m3u8DL-RE "https://example.com/path/index.m3u8" --save-dir ./downloads --auto-select

--save-dir指定保存目录,--auto-select表示自动选择最佳画质的视频流和音频流。下载过程中可以看到分片数量和进度条。下载完成后,工具会调用 FFmpeg 把分片合并成 mp4。

如果需要下载指定清晰度,可以先列出流信息:

N_m3u8DL-RE "https://example.com/path/index.m3u8" --show-info

然后根据输出的流编号选择。

5.3 使用 FFmpeg 直接下载和合并

如果 m3u8 地址不加密、也没有特殊鉴权,用 FFmpeg 下载同样可行:

ffmpeg -i "https://example.com/path/index.m3u8" -c copy output.mp4

这个命令会把播放列表里的分片逐个拉取并复制到output.mp4。它的优点是命令足够短,不依赖额外工具;缺点是断点续传和并发能力不如专用下载器。如果视频很长、分片很多,建议还是用 N_m3u8DL-RE。下载完成后,如果遇到播放器打不开,可以用 FFmpeg 重新转码:

ffmpeg -i output.mp4 -c:v libx264 -c:a aac output_ok.mp4

这一步会把不兼容的编码重新转换成 H.264 + AAC,多数播放器都能正常播放。

6. 微信视频号下载工具的通用思路

微信视频号下载工具不是一个固定的软件,而是一套“找到资源地址 + 下载 + 合并”的组合流程。很多人直接搜“微信视频号下载工具”,希望有一个按钮点击就能搞定,但实际效果往往取决于视频是否加密。更通用的做法是使用前面已经装好的命令行工具来处理。

通用操作流程是:在有权访问内容的前提下,打开微信客户端播放目标视频,然后启动抓包工具或者使用内置的开发者调试能力,在视频开始播放时观察网络请求。筛选mp4m3u8ts类型的关键字,通常能找到视频流的真实地址。复制地址后,交给 yt-dlp、N_m3u8DL-RE 或 FFmpeg 下载。

需要注意几点。第一,微信视频号里的内容大小、清晰度和加密策略不是固定的,有的视频能直接拿到 mp4,有的只能拿到 m3u8,有的会加密成无法直接解析的格式。第二,这个方法只适用于自己有权限查看和保留的视频,不能用来下载付费内容、他人私密内容或者平台明确禁止下载的素材。第三,抓包工具如果需要安装证书,会涉及系统证书信任,这属于敏感操作,不建议在非自己控制的设备上进行。

如果只是偶尔下载一两个视频,也可以先试试浏览器扩展。安装后打开视频页面,扩展会尝试识别视频地址。但扩展的风险在于隐私和广告,建议只安装知名、开源、维护活跃的扩展。如果用于生产环境或批量任务,一定要用命令行工具。

实际操作中,一个比较实用的技巧是先下载 m3u8,再观察分片是否加密。如果下载下来的分片无法播放,说明源地址做了额外处理,这时候不要强行破解,应该回到授权层面确认自己是否有权保留这份内容。

7. 本地接口 API 与批量任务

7.1 用 FastAPI 封装 yt-dlp

当视频下载变成日常工作,手动复制链接进终端会变得很低效。这时候可以写一个本地 HTTP 接口,把下载逻辑封装起来。下面是一个最简单的 FastAPI 示例,接收一个 URL,然后调用 yt-dlp 下载到指定目录。

from fastapi import FastAPI from pydantic import BaseModel import subprocess import os app = FastAPI() class DownloadRequest(BaseModel): url: str output_dir: str = "./downloads" @app.post("/download") def download_video(req: DownloadRequest): os.makedirs(req.output_dir, exist_ok=True) cmd = [ "yt-dlp", "-f", "bv*+ba/b", "-o", os.path.join(req.output_dir, "%(title)s.%(ext)s"), "-c", req.url ] result = subprocess.run(cmd, capture_output=True, text=True, timeout=600) return { "code": result.returncode, "stdout": result.stdout[-1000:], "stderr": result.stderr[-1000:] }

启动服务:

uvicorn app:app --host 127.0.0.1 --port 7860

为什么强调127.0.0.1?因为这个接口可能会被外网访问,如果绑定到0.0.0.0,局域网里的其他设备也能调用,存在被刷流量和滥用下载的风险。对内测试时只绑定本机地址,更安全。

7.2 使用 curl 调用接口

服务启动后,用 curl 测试:

curl -X POST "http://127.0.0.1:7860/download" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/watch?v=123456", "output_dir": "./downloads"}'

如果返回code为 0,说明下载任务已经触发。如果返回非 0,需要看stderr字段里的错误信息。

7.3 简单批量任务队列

当链接数量很多时,可以写一个 Python 调度脚本,逐条读取链接并调用接口。这样可以避免一次性把数十个下载进程全部拉起来,把网络带宽和磁盘 IO 打满。

import requests import time links = [ "https://example.com/watch?v=111", "https://example.com/watch?v=222", "https://example.com/watch?v=333", ] for i, url in enumerate(links): resp = requests.post( "http://127.0.0.1:7860/download", json={"url": url, "output_dir": f"./downloads/batch_{i % 3}"}, timeout=600 ) print(i, resp.status_code, resp.json().get("code")) time.sleep(2)

这个脚本的核心思路是:串行执行,每个任务之间留出一点间隔,避免并发过多导致服务卡死。如果某个任务失败,可以打印日志后继续处理,最后统一检查失败列表。

8. 资源占用与下载性能观察

很多人关心视频下载工具吃不吃配置。实际上,这套工具链不依赖 GPU,显存占用可以忽略。主要资源是 CPU、内存、网络带宽和磁盘空间。

下载过程中,CPU 主要用在两个地方:解析视频流,以及调用 FFmpeg 合并转码。如果只是下载原画质并且不转码,CPU 占用不高;如果用 FFmpeg 把高清视频重新转成 H.264,CPU 占用会明显上升。内存方面,yt-dlp 和 N_m3u8DL-RE 本身占用的内存不多,几十到几百 MB 都很正常,具体取决于分片并发数。网络带宽是最重要的瓶颈,下载速度直接决定任务时长。

更稳妥的判断方式是打开任务管理器或系统监控工具观察。Windows 下可以看“任务管理器”里的“进程”页,Linux 下用tophtop。如果同时下载多个视频,内存和网络占用会线性增加,所以不建议一开始就开十个并发任务,建议从两到三个开始测试,再逐步增加。

磁盘空间的计算也比较直接:视频码率越高,文件越大。比如一个平均码率 4 Mbps 的视频,一分钟大约 30 MB,半小时就是 900 MB。高清视频如果不注意,很容易占满磁盘。批量下载前,先估算总大小,或者用df -h查看剩余空间。

降低占用的方法有几种。一是在下载命令里限速,比如 yt-dlp 用-r 5M限制为 5 MB/s;二是避免同时下载多个大文件;三是优先下载已经合并好的单一视频文件,而不是同时下载多路视频流再加一次合并。如果只是为了快速备份,可以不开 FFmpeg 转码,直接用原始编码封装。

9. 常见问题与排查方法

问题现象可能原因排查方式解决方案
下载时提示 403 Forbidden页面需要登录态,或请求头缺 Referer查看完整报错日志,确认是否要求 Cookie使用浏览器导出的 Cookie 文件,并确保是本人账号
解析失败,提示不支持该平台yt-dlp 版本过旧执行yt-dlp -U或重新安装最新版更新到最新版本
m3u8 下载后无法播放分片加密,或下载不完整用 FFmpeg 检查文件完整性确认内容是否允许下载,不尝试解密
合并失败FFmpeg 未安装或路径未配置运行ffmpeg -version安装 FFmpeg 并加入Path
下载的视频没有声音视频流和音频流未正确合并检查下载命令中是否包含ba使用-f "bv*+ba/b"同时下载音视频
文件名乱码平台标题包含特殊字符查看输出模板使用%(title)s.%(ext)s,必要时用--restrict-filenames
批量任务卡住单个 URL 解析慢或下载脚本无超时添加日志,检查是否卡在某个链接为每个任务设置超时和失败重试
API 服务端口被占用7860 端口已被其他进程使用查看端口占用换一个端口,比如 7861
下载速度很慢网络限制,或并发数太低查看系统网络占用适当增加分片并发,或限速观察瓶颈

这里最关键的排查思路是看日志。命令行工具的报错信息通常已经给出了原因,不要只看“失败”两个字,把stderr最后几行发到搜索引擎里,比自己瞎猜效率高得多。

10. 最佳实践与合规使用建议

第一条建议是:下载任何内容前,先确认自己是否有权保留。备份自己的创作、下载已购买的授权内容、归档公开授权素材,这些都合理;下载付费课程、他人私密影像、平台明确保护的内容,都不合适。工具本身是中立的,但使用场景必须合法合规。

第二条建议是:目录结构要清晰。建议按“日期 / 平台 / 视频标题”三层目录存放,输出文件统一放在output目录,日志放在logs目录,临时分片放在tmp目录。这样批量任务一旦出错,可以很快定位到具体环节。

第三条建议是:批量任务要加日志和失败重试。命令行工具崩溃不可怕,可怕的是不知道哪个任务没执行。可以做一个简单的 CSV 表格记录每条链接的状态:待下载、下载中、成功、失败。任务结束后统一检查失败项,重新执行一次即可。

第四条建议是:本地 API 接口不要暴露到公网,不要用弱口令,不要随意分享 Cookie。下载服务如果被他人滥用,会消耗流量,有可能导致本机 IP 被目标平台限制。接口只绑定本机,必要时再加一个简单的访问密钥。

第五条建议是:涉及人脸、声音、私密信息、版权素材时,必须确认授权。下载到本地只是第一步,后续编辑、发布、商用都要重新评估版权。视频号内容里常见真人出镜和他人创作内容,这类素材不能默认可以随意传播。

第六点建议是:发布或商用前要做效果复核。下载完成的视频花几分钟完整看一遍,确认没有花屏、卡帧、音画不同步、缺少结尾等问题。自动化下载容易忽略这些细节,手动抽检是最稳妥的质量保障。

11. 总结与下一步

这套免费视频下载方案最值得尝试的点是:底层工具都是开源的,命令可以写进脚本,后续扩展空间很大。最先应该验证的是 yt-dlp 基本命令和 FFmpeg 合并流程,把这两个跑通,大部分平台视频下载需求就已经解决了。

最容易踩的坑有三个:一是 FFmpeg 没安装导致合并失败,二是部分平台需要登录态才能下载,三是 m3u8 分片加密后无法用普通工具处理。前两个可以通过安装和 Cookie 解决,第三个必须在授权范围内使用,不要尝试破解。

后续可以继续扩展的方向包括:把下载接口接入定时任务,每天自动检查某个列表并增量下载;在下载完成后自动调用 FFmpeg 转码成统一格式;把输出目录同步到 NAS 或网盘,实现本地自动归档。如果你需要稳定处理大量视频,建议优先把批量任务、失败重试和日志整理做好,再往后接自动化流程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询