ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

N_m3u8DL-RE 流媒体下载器:5 条命令搞定加密解密与直播录制

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 all
  • res、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-timeoutHTTP 超时秒数(默认 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),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进