ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

开源视频下载工具链:yt-dlp、FFmpeg与m3u8合并实践

开源视频下载工具链:yt-dlp、FFmpeg与m3u8合并实践 这次整理的不是某一个软件而是一条完整可用的视频下载工具链。主要覆盖四类需求下载平台视频、下载 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-dlpN_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 pythonN_m3u8DL-RE 提供 macOS 版本下载后放到/usr/local/bin。如果没有 Homebrew也可以直接下载二进制文件手动加入路径整体思路和 Windows 一致。4. yt-dlp 使用与批量下载4.1 基础下载命令yt-dlp 的基本用法非常直接。先看目标页面支持哪些格式和画质再选择下载。查看格式yt-dlp -F https://example.com/watch?v123456输出结果里会列出视频流和音频流的编号比如136是 1080p 视频流140是 m4a 音频流。接下来可以指定编号下载yt-dlp -f 136140 --merge-output-format mp4 https://example.com/watch?v123456如果你想省心一点不关心具体编号可以直接让 yt-dlp 自动选择最佳视频和最佳音频yt-dlp -f bv*ba/b -o %(title)s.%(ext)s https://example.com/watch?v123456这里bv*表示最佳视频流ba表示最佳音频流/b表示如果不存在分离的音视频流就退而求其次下载单个文件。-o指定输出文件名%(title)s是 yt-dlp 的模板语法会自动替换成视频标题。4.2 保存列表和断点续传有些平台会把视频列表放在一个播放列表页面yt-dlp 支持直接下载整个列表。最稳妥的方式是先把所有链接保存到一个文本文件里例如links.txt每行一个 URLyt-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?v123456-x表示提取音频--audio-format mp3表示转成 MP3。如果源视频的音频本来就是 m4a 或者 webm转码过程依赖 FFmpeg。想下载字幕时可以加yt-dlp --write-subs --sub-langs zh-Hans,en --skip-download https://example.com/watch?v123456这个命令只下载字幕不下载视频适合做字幕校对和本地归档。5. m3u8 流媒体下载与视频合并5.1 从页面中找到 m3u8 地址很多网页和微信视频号视频并不直接暴露 mp4 地址播放器拿到的是一个 m3u8 索引文件。找到这个地址是下载这类视频的关键一步。通用思路是这样的在浏览器或已登录的客户端中打开目标视频进入开发者工具的网络面板刷新播放页面筛选m3u8或mpd关键字。播放器开始播放后网络面板里会出现若干条类型为media或fetch的请求其中带index.m3u8、playlist.m3u8、stream.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. 微信视频号下载工具的通用思路微信视频号下载工具不是一个固定的软件而是一套“找到资源地址 下载 合并”的组合流程。很多人直接搜“微信视频号下载工具”希望有一个按钮点击就能搞定但实际效果往往取决于视频是否加密。更通用的做法是使用前面已经装好的命令行工具来处理。通用操作流程是在有权访问内容的前提下打开微信客户端播放目标视频然后启动抓包工具或者使用内置的开发者调试能力在视频开始播放时观察网络请求。筛选mp4、m3u8、ts类型的关键字通常能找到视频流的真实地址。复制地址后交给 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_okTrue) 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_outputTrue, textTrue, timeout600) 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?v123456, output_dir: ./downloads}如果返回code为 0说明下载任务已经触发。如果返回非 0需要看stderr字段里的错误信息。7.3 简单批量任务队列当链接数量很多时可以写一个 Python 调度脚本逐条读取链接并调用接口。这样可以避免一次性把数十个下载进程全部拉起来把网络带宽和磁盘 IO 打满。import requests import time links [ https://example.com/watch?v111, https://example.com/watch?v222, https://example.com/watch?v333, ] 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}}, timeout600 ) print(i, resp.status_code, resp.json().get(code)) time.sleep(2)这个脚本的核心思路是串行执行每个任务之间留出一点间隔避免并发过多导致服务卡死。如果某个任务失败可以打印日志后继续处理最后统一检查失败列表。8. 资源占用与下载性能观察很多人关心视频下载工具吃不吃配置。实际上这套工具链不依赖 GPU显存占用可以忽略。主要资源是 CPU、内存、网络带宽和磁盘空间。下载过程中CPU 主要用在两个地方解析视频流以及调用 FFmpeg 合并转码。如果只是下载原画质并且不转码CPU 占用不高如果用 FFmpeg 把高清视频重新转成 H.264CPU 占用会明显上升。内存方面yt-dlp 和 N_m3u8DL-RE 本身占用的内存不多几十到几百 MB 都很正常具体取决于分片并发数。网络带宽是最重要的瓶颈下载速度直接决定任务时长。更稳妥的判断方式是打开任务管理器或系统监控工具观察。Windows 下可以看“任务管理器”里的“进程”页Linux 下用top或htop。如果同时下载多个视频内存和网络占用会线性增加所以不建议一开始就开十个并发任务建议从两到三个开始测试再逐步增加。磁盘空间的计算也比较直接视频码率越高文件越大。比如一个平均码率 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 或网盘实现本地自动归档。如果你需要稳定处理大量视频建议优先把批量任务、失败重试和日志整理做好再往后接自动化流程。
返回列表