这页解决的不是“假转换”,而是可执行导出

很多所谓在线 M3U8 转 MP4 页面,本质只是让你粘贴地址,然后在浏览器里假装做一键转换。真实环境里,HLS 导出往往卡在请求上下文、编码兼容、签名过期、AES-128 密钥访问和容器不匹配上。这个页面的定位更直接:先看 Manifest 是否有效,再生成你本地终端真正能跑的 FFmpeg 命令。浏览器负责判断流长什么样,终端负责把它导出去,这才是现实流程。

先判断该用 copy 还是重编码

如果源流本身就是 H.264 加 AAC,且封装条件对 MP4 友好,优先试 `ffmpeg -i input.m3u8 -c copy output.mp4`。它快,而且不会再压一遍画质。但只要源流编码不兼容、时间戳异常、音视频轨不规整,copy 模式就可能直接报错。这时别死扛,换成重编码更稳,例如 `ffmpeg -i input.m3u8 -c:v libx264 -c:a aac output.mp4`。你损失的是时间,不是可用性。

需要请求头时,命令必须把上下文带上

很多导出失败不是 FFmpeg 不会拉 HLS,而是你没有把源站要求的请求上下文带进去。常见形式包括 Referer、User-Agent、Cookie 和自定义 Header。FFmpeg 常见写法是 `ffmpeg -headers "Referer: https://example.com\r\nUser-Agent: ...\r\n" -i input.m3u8 -c copy output.mp4`。如果源站依赖 Cookie,还得把 Cookie 一起补进去。别把播放器里一时能播误判成“导出命令一定不需要上下文”。

遇到 AES-128 加密时要先确认密钥可达

不少 HLS 流会在清单里带 `#EXT-X-KEY:METHOD=AES-128,...`。这不代表 FFmpeg 一定不能处理,而是说明它还要额外请求密钥文件。只要密钥 URL 同样受 403、签名、Referer 或 Cookie 限制,导出照样会死。你看到的现象可能是 Manifest 正常、分片也正常,最后卡在 key 请求上。这个时候继续折腾封装参数毫无意义,先确认密钥链接是否在同样上下文下可读。

几种高频报错到底意味着什么

如果报 `HTTP error 403`,先查授权和签名;如果报 `Invalid data found when processing input`,先怀疑返回内容不是有效 HLS,而是 HTML 错页或登录页;如果 copy 模式下出现 `Could not write header` 或容器相关报错,通常说明当前编码或时间基不适合直接塞进 MP4;如果跑到一半中断,优先看 token 是否过期,或者下游分片是否并不稳定。错误信息不是装饰,它直接告诉你该往访问控制、格式有效性还是编码兼容哪个方向查。

一个更像样的导出顺序

第一步,用播放器或抓包确认这是不是有效 Manifest,是主清单还是媒体清单。第二步,确认子清单、分片、密钥是否都可访问。第三步,先试 copy 模式生成命令,失败后再切重编码。第四步,若源站依赖请求头,把 Referer、Cookie、User-Agent 和自定义 Header 补齐。第五步,再决定输出 MP4、MKV、MP3 还是 M4A。顺序对了,你会少走很多弯路;顺序错了,你只会在“为什么这个在线转换器不工作”这种伪问题上绕圈。