N_m3u8DL-RE m3u8 下载器实战指南把一条流媒体地址变成可播放 MP4【免费下载链接】N_m3u8DL-RECross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文.项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE先厘清一个误区m3u8 地址本身不是视频用 F12 在网页播放器里抓到的.m3u8或.mpd地址不是视频文件而是一份清单背后可能挂着十几条视频轨、音轨和字幕轨各自还有多档清晰度部分分片带加密直播源的清单每隔几秒还会刷新一次。N_m3u8DL-RE 是一款跨平台 m3u8 下载器面向 MPD/M3U8/ISM 三种清单格式对应 DASH/HLS/MSS点播与直播都支持Windows、macOS、Linux 均可运行一条命令走完协议解析、轨道选择、多线程下载、解密、合并、混流的全流程。 它内部怎么运转跟住一个下载任务的数据流接入识别从清单原文判定协议谁负责唯一解析入口是src/N_m3u8DL-RE.Parser/StreamExtractor.cs的StreamExtractor类真正的解析由src/N_m3u8DL-RE.Parser/Extractor/下的HLSExtractor、DASHExtractor2、MSSExtractor、LiveTSExtractor四个提取器完成它们共同实现同目录IExtractor.cs定义的接口。怎么干LoadSourceFromText拿到清单原文后做特征嗅探——以#EXTM3U开头交给HLSExtractor包含MPD交给DASHExtractor2包含SmoothStreamingMedia交给MSSExtractor固定标识符则进入LiveTSExtractor裸 TS 流。解析结果统一落到src/N_m3u8DL-RE.Common/Entity/的数据模型StreamSpec轨道规格→Playlist→MediaPart初始化段→MediaSegment分片加密材料由EncryptInfo承载。为何这样设计三种协议的格式差异被隔离在各自提取器内部新增协议只需加一个实现IExtractor的类不产生牵一发动全身的改动下载层下游只面对同一份轨道列表 分片列表形态完全不需要知道源站用的是什么协议。轨道决策用正则挑选目标轨道谁负责核心是src/N_m3u8DL-RE/Util/FilterUtil.cs的SelectStreams由-sv/-sa/-ss三组选择参数与-dv/-da/-ds剔除参数驱动keyvalue:keyvalue这种冒号分隔的复合语法由src/N_m3u8DL-RE/CommandLine/ComplexParamParser.cs解析。怎么干条件以res、codecs、lang、frame等属性做正则匹配forbest、forbestN、worst、all决定命中集合内取哪一条。什么都不传时SelectStreams会弹出基于 Spectre.Console 的交互式多选框MultiSelectionPrompt按基本流/音频/字幕分组展示传--auto-select则自动挑最佳视频、每种语言各取最佳音轨、带上全部字幕。为何这样设计用户不必逐行人工比对分辨率、编码与语言4K HEVC 英语解说 中文字幕可以用一组参数精确表达正则一条都没命中时程序直接以没有可下载轨道报错退出不会默默下错档位。抓取排队分片并发拉取与直播清单刷新谁负责src/N_m3u8DL-RE/Program.cs在解析完成后按类型分派HTTP_LIVE进HTTPLiveRecordManager裸 TS 直录点播走SimpleDownloadManager其余直播进SimpleLiveRecordManager2三者都在src/N_m3u8DL-RE/DownloadManager/实际 HTTP 拉取由src/N_m3u8DL-RE/Downloader/SimpleDownloader.cs承担。怎么干点播路径用Parallel.ForEachAsync并发分片MaxDegreeOfParallelism取--thread-count默认本机 CPU 核心数。直播路径则是逐轨状态机BlockDicSystem.Threading.Tasks.Dataflow 的BufferBlock给每条流排队新分片LiveEndDic跟踪是否出现#EXT-X-ENDLISTRecordLimitReachedDic跟踪时长上限LiveSegmentTracker记录lastSegment与毫秒级RecordingIndex用来去重每次刷新里与上轮重叠的旧分片。为何这样设计点播下完再合并与直播边刷新、边下载、边合并的调度节奏完全不同拆成三个独立管理器让各自的容错边界清晰分片名采用毫秒级时间戳避免同一秒内两个分片互相覆盖。解密与收尾从密文分片到成片谁负责src/N_m3u8DL-RE/Util/MP4DecryptUtil.cs按--decryption-engine调用 mp4decrypt、shaka-packager 或 ffmpeg对应DecryptEngine枚举的MP4DECRYPT、SHAKA_PACKAGER、FFMPEG分片合并由src/N_m3u8DL-RE/Util/MergeUtil.cs处理CENC 密文的 box 结构解析依赖src/N_m3u8DL-RE.Parser/Mp4/里的MP4Parser与MP4InitUtil。怎么干--key支持KID:KEY与纯KEY两种格式--key-text-file可从文件里按 KID 查密钥。开启--mp4-real-time-decryption后SimpleDownloadManager在分片下载完成的同一处直接调MP4DecryptUtil.DecryptAsync产出_dec文件并删除密文省掉二次处理。遇到 Dolby Vision 等特殊情况Program.cs会自动切换二进制合并日志提示 autoBinaryMerge先把分片原样落盘保住数据。为何这样设计解密与合并放进后处理层下载层就只需要专心拉字节解密失败时数据已完整保留在磁盘可以事后换引擎重试而不是整单作废。⚡ 快速上手一条 m3u8 下载命令拿到可播放文件N_m3u8DL-RE https://example.com/video/index.m3u8 \ --auto-select \ -M formatmp4 \ --thread-count 8 \ --save-name demo--auto-select自动挑选各语言最佳轨道免去人工比对-M formatmp4让程序在所有工作完成后调用 ffmpeg 混流分离的音视频--thread-count 8控制并发线程数--save-name demo决定输出文件名。产物是输出目录里的demo.mp4与配套字幕文件可直接播放。 分场景进阶锁 4K、解加密、录直播、统命名锁定 4K HEVC 轨道清单里从 360p 到 4K 多档并存时选错档位要么白占带宽要么浪费画质最常见的坑是正则写得过严导致一条轨道都没命中——此时程序会直接报错退出而不是默默下错。N_m3u8DL-RE https://example.com/video/index.mpd \ -sv res3840*:codecshvc1:forbest \ -sa langen:forbest \ -ss langzh:forbest \ --sub-format SRT \ -M formatmp4可调项把res3840*换成目标分辨率的正则即可换档位去掉codecs约束则不限编码forbest在命中集合里取带宽最高的一条改成forall会下载全部命中轨道需配合--save-pattern避免文件名冲突。加密流一键解密SAMPLE-AES 的 HLS 或 CENC 的 DASH 直接下载就是一堆不可播的密文分片坑在于算法与密钥必须同时给对否则产物是解密报错或乱码。N_m3u8DL-RE https://example.com/encrypted/index.m3u8 \ --key eb676abbcb345e96bbcf616630f1a3da:100b6c20940f779a4589152b57d2dacb \ --decryption-engine FFMPEG \ --custom-hls-method SAMPLE_AES \ --mp4-real-time-decryption \ -M formatmp4可调项各轨道 KEY 相同时--key可直接传纯 KEY--decryption-engine缺省为MP4DECRYPT换成FFMPEG或SHAKA_PACKAGER即切换解密后端--custom-hls-method支持AES_128、CHACHA20等取值配合--custom-hls-key/--custom-hls-iv可显式指定密钥材料。录制一场限时直播直播清单每几秒刷新一次不设时长上限会让录制无限跑下去不开实时合并则分片堆积占满磁盘。N_m3u8DL-RE https://example.com/live/stream.m3u8 \ --auto-select \ --live-real-time-merge \ --live-wait-time 30 \ --live-record-limit 02:00:00 \ --download-retry-count 10可调项--live-wait-time手动指定清单刷新间隔缺省由程序自适应想按点播方式整段抓取直播源时追加--live-perform-as-vod。达到时长上限或清单出现#EXT-X-ENDLIST时SimpleLiveRecordManager2会置位STOP_FLAG优雅收尾。批量任务统一命名十几个地址连跑时文件散落与命名冲突会让故障定位困难关键是统一命名模板并把日志落到磁盘。for url in $(cat urls.txt); do N_m3u8DL-RE $url \ --auto-select \ --save-pattern SaveName_Resolution_Codecs \ --save-dir ./downloads \ --thread-count 8 \ -R 50M \ -M formatmp4 \ --log-file-path ./logs/dl_$(date %Y%m%d).log done可调项--save-pattern支持SaveName、Resolution、Bandwidth、Language等 12 个变量-R 50M按 Mbps 限速-mt让同一任务的音视频字幕并发下载。 收尾想读源码或做扩展先看这三处先看可单独测试的解析夹具。src/N_m3u8DL-RE.Tests/Parser/有完整的 DASH 解析单元测试DASHExtractor2Tests.cs等配套夹具Manifest_1080p.mpd、Manifest_DuplicateSegments.mpd、Manifest_MultiPeriod.mpd放在src/N_m3u8DL-RE.Tests/Resources/Dash/。Parser 工程不碰下载逻辑解析行为改动可以在离线环境单独验证。再看处理器插桩点。src/N_m3u8DL-RE.Parser/Processor/定义了ContentProcessor、KeyProcessor、UrlProcessor三种CanProcessProcess契约src/N_m3u8DL-RE/Processor/里的DemoProcessor.cs、DemoProcessor2.cs演示了如何为特定站点插入改写 URL 或预处理请求的处理器而不改动提取器主体。最后核对重试白名单。src/N_m3u8DL-RE.Common/Util/RetryUtil.cs的WebRequestRetryAsync只对WebException、IOException、HttpRequestException三类网络异常重试解析类错误直接抛出。这条网络错重试、解析错就抛的边界是长时间挂机录制保持稳定的关键。从现有代码推断最可能的两个演进方向直播侧LiveSegmentTracker已经用时间戳边界解决了分片去重低延迟直播源的分片命名压力还会继续推动这块演进Processor的插桩契约则是最自然的沉淀点更多站点级案例大概率会持续流入处理器目录。当需求是把一条 m3u8 或 MPD 地址变成干净、可播的文件时N_m3u8DL-RE 已经把从协议解析到混流收尾的整段路铺完了。【免费下载链接】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),仅供参考
阅读完成 · 觉得有帮助?