[{"data":1,"prerenderedAt":367},["ShallowReactive",2],{"guide-zh-Hans-archive-a-course-over-hls":3,"guide-zh-Hans-archive-a-course-over-hls-related":357},{"id":4,"title":5,"author":6,"body":7,"date":337,"description":338,"difficulty":339,"extension":340,"image":341,"lastModified":342,"meta":343,"navigation":344,"outcome":345,"path":346,"readingTime":347,"robots":341,"scenario":348,"seo":349,"stem":351,"tools":352,"__hash__":356},"guides_zh_Hans\u002Fzh-Hans\u002F8.guides\u002F1.archive-a-course-over-hls.md","网课 M3U8 下载指南：把 HLS 推流的课程完整存成 MP4","FlowPick Team",{"type":8,"value":9,"toc":325},"minimark",[10,14,17,21,24,31,37,64,71,74,78,88,107,110,117,122,126,129,137,150,153,157,165,171,176,179,199,202,206,217,223,228,231,234,240,246,249,253,256,264,267,270,276,287,293,303,306,313],[11,12,13],"p",{},"买过的网课，平台只肯在网页里播放，不给下载按钮——这大概是最多人搜\"M3U8 下载\"的原因。课程视频几乎都是按 HLS 分片推流的，每个分片的地址写在一份 M3U8 清单里，而这份清单在地址栏里看不到。",[11,15,16],{},"这篇指南讲完整的一条路：找到清单、读清单、选清晰度、下载合并成 MP4、剪掉片头。内容来自我们自己批量归档课程时踩过的坑，不是格式文档的复述，哪一步会卡住、为什么卡，正文里都有。",[18,19,20],"h2",{"id":20},"先判断这门课能不能下载",[11,22,23],{},"动手之前过两个前提，能省掉后面所有白费的努力。",[11,25,26,30],{},[27,28,29],"strong",{},"第一，视频要在你自己的浏览器里能正常播放。"," 播都播不了的课，下载无从谈起。",[11,32,33,36],{},[27,34,35],{},"第二，看清加密方式。"," 课程平台给 HLS 流加密有两种做法，结局完全不同：",[38,39,40,58],"ul",{},[41,42,43,46,47,51,52,57],"li",{},[27,44,45],{},"AES-128","：清单里带 ",[48,49,50],"code",{},"EXT-X-KEY"," 标签的普通加密。FlowPick 扩展可以自动解密，不影响下载，原理见",[53,54,56],"a",{"href":55},"\u002Fzh-Hans\u002Fdocs\u002Ffeatures\u002Fvideo-sniffing","视频嗅探","。",[41,59,60,63],{},[27,61,62],{},"DRM（Widevine、FairPlay）","：分片本身就是密文，解密密钥只存在于播放器的受保护内存里，不会交给网页。FlowPick 不做破解，浏览器端的工具也做不到。",[11,65,66,67,70],{},"自己判断属于哪种：打开开发者工具的 Network 面板，筛选 ",[48,68,69],{},"m3u8","，然后播放视频。出现了清单请求、分片响应是能识别的媒体数据，就是没加密或只是 AES-128，这套流程适用。只看到分片请求没有清单、或者响应全是乱码，到这里就可以停了，这篇帮不上忙。",[11,72,73],{},"还有一句要说在前面：这套流程用于你有权保存的内容——自己买的课、条款允许离线的平台，或者自己录的课。某个平台具体允不允许，答案在它自己的条款里，不在这篇指南里。",[18,75,77],{"id":76},"为什么下载网课绕不开-m3u8","为什么下载网课绕不开 M3U8",[11,79,80,81,87],{},"想下载 HLS 视频，就得先拿到 M3U8 清单。这不是工具的偏执，是协议本身的规矩。HLS 的规范是 ",[53,82,86],{"href":83,"rel":84},"https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc8216",[85],"nofollow","RFC 8216","，它规定的结构是这样的：",[38,89,90,101],{},[41,91,92,95,96,100],{},[27,93,94],{},"Master 清单（主清单）","：里面没有一帧视频。它列的是各个",[97,98,99],"em",{},"变体","（variant），也就是同一个视频的不同清晰度版本。",[41,102,103,106],{},[27,104,105],{},"Media 清单（媒体清单）","：每个变体各有一份，里面才是真正的分片地址列表。",[11,108,109],{},"所以\"下载这个视频\"的第一层决策，其实是\"下载哪个变体\"。你不主动选，工具也会替你选——而工具默认挑的，未必是你想要的。",[11,111,112],{},[113,114],"img",{"alt":115,"src":116},"HLS 清单结构：master 清单指向三个清晰度，每个清晰度有自己的分片列表","\u002Fimg\u002Fguides\u002Fhls-playlist-structure.svg",[11,118,119],{},[97,120,121],{},"一个 master 清单，三个清晰度，每个清晰度一份独立的分片列表。高亮那个是这篇指南要下的。",[18,123,125],{"id":124},"第一步找到课程的-m3u8-地址","第一步：找到课程的 M3U8 地址",[11,127,128],{},"两个办法，任选其一。",[11,130,131,134,135,57],{},[27,132,133],{},"装了 FlowPick 扩展，直接看嗅探结果。"," 打开课程播放页，扩展会在网络层自动捕获页面发出的媒体请求，M3U8 清单一般会直接出现在资源列表里，点开复制地址即可。检测原理见",[53,136,56],{"href":55},[11,138,139,142,143,146,147,149],{},[27,140,141],{},"手动找，用开发者工具。"," 按 ",[48,144,145],{},"F12"," 打开开发者工具，切到 Network（网络）面板，在筛选框里输入 ",[48,148,69],{},"，然后播放视频。出现的请求里，通常第一个就是 master 清单，右键复制它的 URL。",[11,151,152],{},"注意清单可能不止一份：先出现的一般是 master，随后出现的是它指向的媒体清单。两个地址后面都有用。",[18,154,156],{"id":155},"第二步分析清单选一个真实存在的清晰度","第二步：分析清单，选一个真实存在的清晰度",[11,158,159,160,164],{},"把 master 清单的地址粘到 ",[53,161,163],{"href":162},"\u002Fzh-Hans\u002Ftools\u002Fm3u8-playlist-analyzer","M3U8 清单分析器","。它会列出所有变体、各自的分辨率与码率，以及单独列出的音轨。后续下载步骤需要 FlowPick 浏览器扩展，请先在支持的浏览器里安装。",[11,166,167],{},[113,168],{"alt":169,"src":170},"Mux 公开 HLS 示例的五个清晰度，显示分辨率、带宽和编码","\u002Fimg\u002Fguides\u002Fplaylist-analyzer-variants.jpg",[11,172,173],{},[97,174,175],{},"英文界面，使用 Mux 公开测试流，并非课程录制。master 列出五个变体；分片数量需要打开所选变体的媒体清单另行查看。",[11,177,178],{},"这一步为什么不能省，三个理由都来自实际踩坑：",[38,180,181,187,193],{},[41,182,183,186],{},[27,184,185],{},"\"1080p\"可能是拉大的 720p。"," 2020 年前后录的课，源头常常就是 720p，但 master 里同时挂着一个从它放大出来的 1080p 变体。选最大的那个，得到的是更大的文件，不是更清楚的画面。",[41,188,189,192],{},[27,190,191],{},"音轨可能是独立的。"," 较新的平台经常把音频单独放一条轨道。直接拿 master 去下载，音轨怎么处理就成了下载完之后才发现的事。",[41,194,195,198],{},[27,196,197],{},"分片数量决定要等多久。"," 两小时的课，分片是几百个。心里有个数，才知道这次下载是十分钟的事还是一小时的事。",[11,200,201],{},"想看分片数量和总时长，打开选定变体的媒体清单，master 本身不含这些信息。",[18,203,205],{"id":204},"第三步下载分片合并成-mp4","第三步：下载分片，合并成 MP4",[11,207,208,209,212,213,57],{},"把",[27,210,211],{},"选定清晰度的媒体清单地址","（不是 master）交给 ",[53,214,216],{"href":215},"\u002Fzh-Hans\u002Fm3u8-downloader","M3U8 下载器",[11,218,219],{},[113,220],{"alt":221,"src":222},"HLS 下载器正在拉取分片，显示下载进度、分片计数和速度","\u002Fimg\u002Fguides\u002Fm3u8-downloader-progress.jpg",[11,224,225],{},[97,226,227],{},"在已安装 FlowPick 的 Chrome 中实际下载 Mux 公开测试流的 720p 变体，界面语言为英文。这是下载过程截图，不代表课程已完整归档。",[11,229,230],{},"多这一步是故意的：把选清晰度的决定权从工具手里拿回来。分片列表固定下来之后，一旦失败，能定位到具体是哪一段出问题，而不是笼统地怪\"选错清晰度\"。",[11,232,233],{},"下载器会把分片逐个拉下来，在浏览器里拼成一个 MP4，全程不上传。这中间最常被两件事打断：",[11,235,236,239],{},[27,237,238],{},"分片地址带签名，下到一半过期。"," 很多 CDN 给每个分片地址签短时效，四十分钟的下载可能比签名活得还久，于是文件尾部的分片集体 403。对策：重新复制一次清单拿新签名；或者挑小一号的清晰度、分几次下，把单次时长压到过期窗口以内。",[11,241,242,245],{},[27,243,244],{},"浏览器存储吃紧。"," 一门课动辄几个 G。Chrome 和 Edge 走文件系统直接写盘，上限就是磁盘空间；Firefox 会先暂存到浏览器存储、完成后再让你保存，那一刻两边都要有余量。开始下载前，把其他标签页关掉。",[11,247,248],{},"另外：下载过程中不要关闭标签页。切到后台没关系，关掉就没法继续。",[18,250,252],{"id":251},"第四步剪掉片头片尾","第四步：剪掉片头片尾",[11,254,255],{},"录播课开头通常有 20 到 40 秒的平台片头，结尾还有一页\"感谢观看\"。一门课上几十讲，这些片段加起来很可观。",[11,257,258,259,263],{},"用",[53,260,262],{"href":261},"\u002Fzh-Hans\u002Ftools\u002Fvideo-trimmer","视频裁剪","按时间点切。建议从合并好的 MP4 上剪，不要对分片动手——一次就够，而且在剪满意之前原件还在。",[11,265,266],{},"剪完先别删原件，检查两件事：切口附近的音画有没有错位，切口后的第一秒是不是定格画面。这两个毛病都和从关键帧附近下刀有关，不是随机出现的。",[18,268,269],{"id":269},"下载失败时的排查",[11,271,272,275],{},[27,273,274],{},"为什么下到一半，分片全变 403？"," 清单里的分片地址带签名，过期了。回到播放页重新打开这一讲，复制当前的清单地址，从头再下。课程单讲特别长的话，分几次下载，别指望一次签名撑到底。",[11,277,278,281,282,286],{},[27,279,280],{},"为什么合并出来的 MP4 没有声音？"," 音频是独立轨道，没合进去。回到分析器看 master 里有没有单独的音频条目，再确认下载器有没有对应的选项。如果都没有，用",[53,283,285],{"href":284},"\u002Fzh-Hans\u002Faudio-downloader","音频下载器","单独把音轨存下来，两个文件放在一起用。",[11,288,289,292],{},[27,290,291],{},"为什么第一分钟之后分片全部 404？"," 清单本身过期了。带登录态的课程平台很常见，重新播放一次拿新清单即可。",[11,294,295,298,299,302],{},[27,296,297],{},"分析器只显示一个清晰度，下载却总失败？"," 看看清单是不是要求特定的 ",[48,300,301],{},"Referer","。有些课程平台会拒绝那些看起来不是从播放页发起的请求。用扩展发起下载比单独开工具页更省事——扩展会带上正在播放的那个标签页的请求上下文。",[18,304,305],{"id":305},"存好之后",[11,307,308,309,312],{},"每讲一个 MP4，清晰度是你自己选定的，片头片尾已经剪掉。文件名建议带上序号，",[48,310,311],{},"course-03-hashing.mp4"," 比一串时间戳好找得多，两年后你会感谢现在的自己。",[11,314,315,316,320,321,57],{},"合并这一步不会改变的东西——封装格式、编码、为什么 720p 的源出来的还是 720p——见",[53,317,319],{"href":318},"\u002Fzh-Hans\u002Fdocs\u002Ffeatures\u002Fformat-conversion","格式转换","。更多课程归档的背景，见",[53,322,324],{"href":323},"\u002Fzh-Hans\u002Fdocs\u002Fusecases\u002Fonline-courses","在线课程下载",{"title":326,"searchDepth":327,"depth":327,"links":328},"",2,[329,330,331,332,333,334,335,336],{"id":20,"depth":327,"text":20},{"id":76,"depth":327,"text":77},{"id":124,"depth":327,"text":125},{"id":155,"depth":327,"text":156},{"id":204,"depth":327,"text":205},{"id":251,"depth":327,"text":252},{"id":269,"depth":327,"text":269},{"id":305,"depth":327,"text":305},"2026-10-29","网课只在网页里播放、平台不给下载文件时，怎么把 HLS 推流的课程存成 MP4：找到 M3U8 清单、选对真实清晰度、下载分片合并、剪掉片头，以及签名过期、存储不够这些实际会卡住的地方。","intermediate","md",null,"2026-11-01",{},true,"每讲一个 MP4，清晰度由你选定，片头片尾已剪掉。","\u002Fzh-hans\u002Fguides\u002Farchive-a-course-over-hls",8,"archive",{"description":350,"title":5},"网课 M3U8 下载完整教程：课程平台按 HLS 分片推流、不提供下载地址时，如何在浏览器里找到 m3u8 清单、分析各清晰度变体、选定真实分辨率、下载分片并合并为 MP4，再剪掉片头片尾。包含分片 403 签名过期、浏览器存储不足、合并后无声音等常见问题的处理方法。仅用于你有权保存的课程。","zh-Hans\u002F8.guides\u002F1.archive-a-course-over-hls",[353,354,355],"\u002Ftools\u002Fm3u8-playlist-analyzer","\u002Fm3u8-downloader","\u002Ftools\u002Fvideo-trimmer","jiETiV8yz_YBBSCvLSth0gLYPgq17hhHyueUxxUkaok",[358,360],{"path":346,"title":5,"description":338,"tools":359},[353,354,355],{"path":361,"title":362,"description":363,"tools":364},"\u002Fzh-hans\u002Fguides\u002Fsave-a-live-replay","直播回放怎么保存？趁平台删掉前下载或录制成 MP4","直播回放是互联网上最短命的视频：平台留一周或一个月，说删就删。这篇讲过期前怎么拿到能用的文件——先判断页面给了什么，再决定取流还是录制，最后修封装、剪片段。",[365,366,355],"\u002Frecording","\u002Ftools\u002Fts-to-mp4",1793546745791]