归档保存进阶8 分钟阅读

网课 M3U8 下载指南:把 HLS 推流的课程完整存成 MP4

网课只在网页里播放、平台不给下载文件时,怎么把 HLS 推流的课程存成 MP4:找到 M3U8 清单、选对真实清晰度、下载分片合并、剪掉片头,以及签名过期、存储不够这些实际会卡住的地方。
更新于 2026年11月1日

按顺序使用的工具

  1. 1 M3U8 播放列表分析器
  2. 2 M3U8 下载器
  3. 3 视频剪辑器

最后得到什么: 每讲一个 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——见格式转换。更多课程归档的背景,见在线课程下载。