网课 M3U8 下载指南:把 HLS 推流的课程完整存成 MP4
按顺序使用的工具
最后得到什么: 每讲一个 MP4,清晰度由你选定,片头片尾已剪掉。
买过的网课,平台只肯在网页里播放,不给下载按钮——这大概是最多人搜"M3U8 下载"的原因。课程视频几乎都是按 HLS 分片推流的,每个分片的地址写在一份 M3U8 清单里,而这份清单在地址栏里看不到。
这篇指南讲完整的一条路:找到清单、读清单、选清晰度、下载合并成 MP4、剪掉片头。内容来自我们自己批量归档课程时踩过的坑,不是格式文档的复述,哪一步会卡住、为什么卡,正文里都有。
先判断这门课能不能下载
动手之前过两个前提,能省掉后面所有白费的努力。
第一,视频要在你自己的浏览器里能正常播放。 播都播不了的课,下载无从谈起。
第二,看清加密方式。 课程平台给 HLS 流加密有两种做法,结局完全不同:
- AES-128:清单里带
EXT-X-KEY标签的普通加密。FlowPick 扩展可以自动解密,不影响下载,原理见视频嗅探。 - DRM(Widevine、FairPlay):分片本身就是密文,解密密钥只存在于播放器的受保护内存里,不会交给网页。FlowPick 不做破解,浏览器端的工具也做不到。
自己判断属于哪种:打开开发者工具的 Network 面板,筛选 m3u8,然后播放视频。出现了清单请求、分片响应是能识别的媒体数据,就是没加密或只是 AES-128,这套流程适用。只看到分片请求没有清单、或者响应全是乱码,到这里就可以停了,这篇帮不上忙。
还有一句要说在前面:这套流程用于你有权保存的内容——自己买的课、条款允许离线的平台,或者自己录的课。某个平台具体允不允许,答案在它自己的条款里,不在这篇指南里。
为什么下载网课绕不开 M3U8
想下载 HLS 视频,就得先拿到 M3U8 清单。这不是工具的偏执,是协议本身的规矩。HLS 的规范是 RFC 8216,它规定的结构是这样的:
- Master 清单(主清单):里面没有一帧视频。它列的是各个变体(variant),也就是同一个视频的不同清晰度版本。
- Media 清单(媒体清单):每个变体各有一份,里面才是真正的分片地址列表。
所以"下载这个视频"的第一层决策,其实是"下载哪个变体"。你不主动选,工具也会替你选——而工具默认挑的,未必是你想要的。
一个 master 清单,三个清晰度,每个清晰度一份独立的分片列表。高亮那个是这篇指南要下的。
第一步:找到课程的 M3U8 地址
两个办法,任选其一。
装了 FlowPick 扩展,直接看嗅探结果。 打开课程播放页,扩展会在网络层自动捕获页面发出的媒体请求,M3U8 清单一般会直接出现在资源列表里,点开复制地址即可。检测原理见视频嗅探。
手动找,用开发者工具。 按 F12 打开开发者工具,切到 Network(网络)面板,在筛选框里输入 m3u8,然后播放视频。出现的请求里,通常第一个就是 master 清单,右键复制它的 URL。
注意清单可能不止一份:先出现的一般是 master,随后出现的是它指向的媒体清单。两个地址后面都有用。
第二步:分析清单,选一个真实存在的清晰度
把 master 清单的地址粘到 M3U8 清单分析器。它会列出所有变体、各自的分辨率与码率,以及单独列出的音轨。后续下载步骤需要 FlowPick 浏览器扩展,请先在支持的浏览器里安装。

英文界面,使用 Mux 公开测试流,并非课程录制。master 列出五个变体;分片数量需要打开所选变体的媒体清单另行查看。
这一步为什么不能省,三个理由都来自实际踩坑:
- "1080p"可能是拉大的 720p。 2020 年前后录的课,源头常常就是 720p,但 master 里同时挂着一个从它放大出来的 1080p 变体。选最大的那个,得到的是更大的文件,不是更清楚的画面。
- 音轨可能是独立的。 较新的平台经常把音频单独放一条轨道。直接拿 master 去下载,音轨怎么处理就成了下载完之后才发现的事。
- 分片数量决定要等多久。 两小时的课,分片是几百个。心里有个数,才知道这次下载是十分钟的事还是一小时的事。
想看分片数量和总时长,打开选定变体的媒体清单,master 本身不含这些信息。
第三步:下载分片,合并成 MP4
把选定清晰度的媒体清单地址(不是 master)交给 M3U8 下载器。

在已安装 FlowPick 的 Chrome 中实际下载 Mux 公开测试流的 720p 变体,界面语言为英文。这是下载过程截图,不代表课程已完整归档。
多这一步是故意的:把选清晰度的决定权从工具手里拿回来。分片列表固定下来之后,一旦失败,能定位到具体是哪一段出问题,而不是笼统地怪"选错清晰度"。
下载器会把分片逐个拉下来,在浏览器里拼成一个 MP4,全程不上传。这中间最常被两件事打断:
分片地址带签名,下到一半过期。 很多 CDN 给每个分片地址签短时效,四十分钟的下载可能比签名活得还久,于是文件尾部的分片集体 403。对策:重新复制一次清单拿新签名;或者挑小一号的清晰度、分几次下,把单次时长压到过期窗口以内。
浏览器存储吃紧。 一门课动辄几个 G。Chrome 和 Edge 走文件系统直接写盘,上限就是磁盘空间;Firefox 会先暂存到浏览器存储、完成后再让你保存,那一刻两边都要有余量。开始下载前,把其他标签页关掉。
另外:下载过程中不要关闭标签页。切到后台没关系,关掉就没法继续。
第四步:剪掉片头片尾
录播课开头通常有 20 到 40 秒的平台片头,结尾还有一页"感谢观看"。一门课上几十讲,这些片段加起来很可观。
用视频裁剪按时间点切。建议从合并好的 MP4 上剪,不要对分片动手——一次就够,而且在剪满意之前原件还在。
剪完先别删原件,检查两件事:切口附近的音画有没有错位,切口后的第一秒是不是定格画面。这两个毛病都和从关键帧附近下刀有关,不是随机出现的。
下载失败时的排查
为什么下到一半,分片全变 403? 清单里的分片地址带签名,过期了。回到播放页重新打开这一讲,复制当前的清单地址,从头再下。课程单讲特别长的话,分几次下载,别指望一次签名撑到底。
为什么合并出来的 MP4 没有声音? 音频是独立轨道,没合进去。回到分析器看 master 里有没有单独的音频条目,再确认下载器有没有对应的选项。如果都没有,用音频下载器单独把音轨存下来,两个文件放在一起用。
为什么第一分钟之后分片全部 404? 清单本身过期了。带登录态的课程平台很常见,重新播放一次拿新清单即可。
分析器只显示一个清晰度,下载却总失败? 看看清单是不是要求特定的 Referer。有些课程平台会拒绝那些看起来不是从播放页发起的请求。用扩展发起下载比单独开工具页更省事——扩展会带上正在播放的那个标签页的请求上下文。
存好之后
每讲一个 MP4,清晰度是你自己选定的,片头片尾已经剪掉。文件名建议带上序号,course-03-hashing.mp4 比一串时间戳好找得多,两年后你会感谢现在的自己。
合并这一步不会改变的东西——封装格式、编码、为什么 720p 的源出来的还是 720p——见格式转换。更多课程归档的背景,见在线课程下载。