N_m3u8DL-RE 流媒体下载器:5 条命令搞定加密解密与直播录制
N_m3u8DL-RE 流媒体下载器:5 条命令搞定加密解密与直播录制
【免费下载链接】N_m3u8DL-RECross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文.项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE
播放器能放、右键却找不到"另存为",直播一停播,想存的片段就没了。N_m3u8DL-RE 是一款跨平台的命令行流媒体下载工具:把 MPD、M3U8、ISM 链接丢给它,自动解析轨道、多线程拉取分片、合并成可播放文件,加密流还能直接解密密钥下载。适合想留存自己有权播放的音视频的用户。
功能快照:10 秒看懂它能干什么
| 项目 | 说明 |
|---|---|
| 协议格式 | MPD(DASH)、M3U8(HLS)、ISM(MSS),点播与直播均支持 |
| 核心能力 | 多线程并发下载、KID:KEY 加密解密、直播实时合并录制、正则轨道筛选、文件名模板、限速与重试 |
| 附带命令 | concat/merge/mux手动合并混流,doctor体检环境 |
| 运行平台 | Windows / Linux / macOS,免费开源(MIT License) |
| 硬依赖 | 合并与混流依赖 ffmpeg |
五分钟备齐环境:下载二进制 + 确认 ffmpeg
装它只有两件事:拿到可执行文件,确认 ffmpeg 就位。
从项目 Release 页下载对应系统的二进制包,可执行文件加入 PATH 即可(Windows 上双击 exe 也能跑,但命令行体验更好)。Arch Linux 及其衍生发行版走 AUR:
# 稳定版(开发版把包名换成 n-m3u8dl-re-git) yay -Syu n-m3u8dl-re-bin最容易漏的一步是 ffmpeg:合并、混流、混流混字幕全靠它,PATH 里没有就等着报错。装完单独确认一次:
ffmpeg -version然后验证工具本身:
# 查看版本号 N_m3u8DL-RE --version # 体检工具版本与系统环境(含 ffmpeg、mp4decrypt 是否就位) N_m3u8DL-RE doctor两条命令都有正常输出,环境就算备好了。老版本 Windows 自带终端可能跑不了本程序,遇到显示异常换 cmder 或 WSL 再试。
第一条下载命令:用官方测试流跑通
拿 测试流清单 里第一条清晰 DASH 流(多音轨多字幕)验证全链路:
# 官方测试流清单(TestStreams.md)中的 v7-Clear 多音轨流 N_m3u8DL-RE "https://media.axprod.net/TestVectors/v7-Clear/Manifest_1080p.mpd" \ --save-dir "./downloads" \ --auto-select # 每类轨道自动挑最高码率并全量下载跑完进./downloads看产物:mp4 视频、音频和字幕文件,各轨道一份;--write-meta-json默认开启,还会留一份解析信息 json,方便后续脚本化。到这里就算跑通了。
任务一:大文件提速下载
分片多的内容,串行下载太慢。核心就两个参数:
# --thread-count 下载线程数(默认本机 CPU 核数) N_m3u8DL-RE "https://example.com/video.m3u8" \ --save-name "我的视频" \ --save-dir "./downloads" \ --thread-count 8 \ -mt--thread-count:并发拉分片的线程数,默认等于本机 CPU 核数,显式指定适合固定跑批。-mt(即--concurrent-download):多条已选轨道并行下载,不用等一条下完再下下一条。- 带宽紧张时加
-R 10M限速,单位支持 Mbps / Kbps,防止下载把带宽占满。
坑位提醒:线程数不是越大越好,超过分片数或带宽承载没有意义,8 到 16 对多数场景够用。
任务二:加密流的密钥怎么配
流是 AES / CENC 加密的,密钥一般抓包或从 DRM 响应里拿。--key的标准写法是KID:KEY,KID 是密钥 ID,KEY 是 16 字节密钥本体,两者均支持 HEX 或 Base64:
# KID 在前、KEY 在后;KID/KEY 均支持 16 字节 HEX 或 Base64 N_m3u8DL-RE "https://azclwds01.akamaized.net/4e8f6858-5d05-4e28-83ab-48c7a2b259e1/XVuosg_tab_hd.ism/Manifest" \ --key "e5114f87b3e54b9faca331e6e6d646a6:55c5d9f1cedfd018b75623f2565a1d29" \ --save-name "解密后的视频"- 所有轨道共用同一把 KEY 时可省略 KID,直接
--key KEY。 - 密钥多到手软,用
--key-text-file keys.txt一次给全,程序按 KID 自动匹配。 --decryption-engine切换解密引擎,可选MP4DECRYPT(默认)、FFMPEG、SHAKA_PACKAGER;工具不在 PATH 里时再用--decryption-binary-path指认具体路径。解密实现可以看 Crypto 模块 里的 AES 与 ChaCha20 代码。
坑位提醒:KID 与 KEY 写反、或密钥对不上该 KID,是"下载成功但放不了"的头号原因,核对时认准 KID 在前。
任务三:录满两小时自动停的直播录制
想把直播落成一个连续文件而不是几百个分片碎片,靠实时合并:
# --live-record-limit 录满 02:00:00 自动停止 N_m3u8DL-RE "https://example.com/live.m3u8" \ --live-real-time-merge \ --live-wait-time 30 \ --live-record-limit 02:00:00 \ --live-take-count 16 \ --save-name "直播录制"--live-real-time-merge:边下边合并,进程结束即得完整文件。--live-wait-time 30:列表刷新间隔 30 秒,调小跟得紧但请求更频繁。--live-record-limit:时长上限,格式HH:mm:ss,到点自动停。--live-take-count 16:开播瞬间回溯抓取的前 16 个分片(默认值),调小可少录开头。
默认--live-keep-segments为开,实时合并的同时保留分片作备份,不需要可显式关闭。进阶选项--live-pipe-mux让 ffmpeg 走管道实时混流到 TS 文件、磁盘占用更低,但弱网别开——管道内数据由 ffmpeg 读取,网络抖动时容易丢直播数据,官方文档也专门标注了这一点。
任务四:用正则精挑轨道
-sv/-sa/-ss接受key=REGEX的链式写法,末尾用for=指定挑选策略:
# 链式写法:key=REGEX:for=策略 N_m3u8DL-RE "https://example.com/video.m3u8" \ -sv best \ -sv "res=^3840x:codecs=hvc1:for=best" \ -sa "lang=en:for=best" \ -ss allres、codecs、lang、name、frame、channel、bwMin/bwMax等都参与匹配;for=可选best、worst、all,也支持best2这类"每种基础语言取最佳 N 条"。- 想反向剔除轨道,用对应的
-dv/-da/-ds。 - 一个选择参数都没传时,程序会进交互式选流界面,方向键加回车勾选即可。
- 选完流仍拿不准,加
--skip-download只解析不下载,先把轨道清单看清楚。
拿不准某个选项的完整参数时,--morehelp select-video会打印该选项的全部可用键值。
任务五:让文件名自带元数据
同时下多档分辨率时,靠--save-pattern给文件名加变量,避免互相覆盖:
# --save-pattern 输出文件名模板,变量区分大小写 N_m3u8DL-RE "https://example.com/video.m3u8" \ --save-name video \ --save-pattern "<SaveName>_<Resolution>_<Language>"可用变量包括<SaveName>、<Resolution>、<Codecs>、<Language>、<Bandwidth>、<MediaType>、<Channels>、<FrameRate>、<VideoRange>、<GroupId>、<Name>、<Id>,缺失的信息替换为空字符串。长文件名会自动截断并追加短哈希防重名,完整模板变量说明用--morehelp save-pattern查。
⚠️ 出了问题怎么办:按报错对号入座
启动就报 "ffmpeg not found" 怎么办?
原因是合并与混流强依赖 ffmpeg,但 PATH 里没有它。系统级安装(brew install ffmpeg或对应包管理器),或临时指认路径:
--ffmpeg-binary-path /path/to/ffmpeg解密时报 "mp4decrypt not found" 怎么办?
默认解密引擎是 MP4DECRYPT,需要 MP4Box 套件里的 mp4decrypt,机器上没装就会报这个错。最简单的办法是换引擎,ffmpeg 你反正已经有了:
--decryption-engine FFMPEG下载成功但文件放不了、有花屏怎么办?
多半是--key的 KID 和 KEY 顺序写反,或密钥对不上这个 KID。核对 KID 在前、KEY 在后且各为 16 字节合法编码;多密钥场景确认每个 KID 都有对应--key,或直接--key-text-file一次给全。
直播录制中断、分片大量失败怎么办?
通常是列表刷新间隔偏长或网络抖动。把刷新间隔调短、重试次数(默认 7 次)提高、HTTP 超时(默认 100 秒)放宽:
--live-wait-time 10 \ --download-retry-count 10 \ --http-request-timeout 120老版本 Windows 终端跑不了怎么办?
程序在老版本 Windows 自带终端里可能不兼容,换 cmder 之类的新终端,或直接用 WSL 跑 Linux 构建版。
高频参数速查表与源码导读
| 参数 | 作用 |
|---|---|
--save-dir/--save-name | 输出目录 / 保存文件名 |
--thread-count | 下载线程数(默认本机 CPU 核数) |
-mt | 已选轨道并发下载 |
--auto-select | 自动选择各类型最佳轨道 |
-sv/-sa/-ss | 按正则选视频 / 音频 / 字幕 |
-dv/-da/-ds | 按正则剔除轨道 |
--key | 解密密钥,KID:KEY格式 |
--key-text-file | 密钥文件,按 KID 自动匹配 |
--decryption-engine | 解密引擎:MP4DECRYPT/FFMPEG/SHAKA_PACKAGER |
--live-real-time-merge | 直播边下边实时合并 |
--live-record-limit | 直播录制时长上限HH:mm:ss |
--live-wait-time | 直播列表刷新间隔(秒) |
--live-take-count | 首次回溯抓取分片数(默认 16) |
--live-keep-segments | 实时合并时保留分片(默认开) |
--live-pipe-mux | 管道 + ffmpeg 实时混流到 TS(弱网勿开) |
--custom-range | 点播按分片序号或时间只下部分 |
--save-pattern | 输出文件名模板 |
-H | 追加请求头,如 Cookie / User-Agent |
--download-retry-count | 分片失败重试次数(默认 7) |
--http-request-timeout | HTTP 超时秒数(默认 100) |
-R | 限速,如10M/100K |
--custom-proxy | 指定代理地址 |
--tmp-dir | 临时分片目录 |
--del-after-done | 完成后清理临时文件(默认开) |
--log-file-path/--log-level | 日志路径 / 日志级别 |
--task-start-at | 到点(yyyyMMddHHmmss)才开始任务 |
--append-url-params | 分片 URL 继承主链接查询参数 |
--skip-download | 只解析不下载 |
doctor | 工具命令,体检版本与系统环境 |
想深入看实现,从这几处入手:
- README.md:完整参数帮助与各 More Help 细节
- TestStreams.md:官方测试流清单,含加密与直播样例
- 协议解析入口:
HLSExtractor.cs、DASHExtractor2.cs、MSSExtractor.cs对应三种格式 - 下载与录制调度:
SimpleLiveRecordManager2.cs是直播录制主体 - 解密工具:AES 与 ChaCha20 实现
【免费下载链接】N_m3u8DL-RECross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文.项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考