N_m3u8DL-RE 报 mux failed?三步定位 mkvmerge 语言标签问题并修复
【免费下载链接】N_m3u8DL-RECross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文.项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE
你用 N_m3u8DL-RE 下载一条带音频的视频流,任务跑到最后一步蹦出mux failed。下载本身没问题,卡住的是最后的混流。别慌,这个报错看着吓人,其实原因很简单:音轨的语言标签不是有效的语言代码,mkvmerge 拒绝混流。下面带你一步步排查。
还原一下现场:正常下载,分片全部下完,分片合并也顺利完成,日志一路绿灯,直到最后"混流"环节突然报错。加--log-level DEBUG重跑一次,或者翻当时留下的日志文件,你会找到 mkvmerge 的一行输出:
'tm' is not a valid IETF BCP 47/RFC 5646 language tag in '--language 0:tm'. Additional information from the parser: The value 'tm' is not a valid ISO 639 language code.这行话的意思是:工具调用 mkvmerge 时传了--language 0:tm,而tm不是有效的语言代码,mkvmerge 直接拒绝处理。
日志里哪一行暴露了真正原因
说白了就是:源流元数据里的语言代码不规范,旧版本没做规范化,原样透传给了 mkvmerge。背后的规矩是——MKV 容器里轨道的语言标签必须符合 IETF BCP 47(也就是 RFC 5646)标准,其中语言子标签必须是 ISO 639 里登记过的代码,常见的有en、zh这类两字母,或vie(越南语)、jpn(日语)这类三字母。tm在登记表里查不到,到了 mkvmerge 面前必然被拒。
看代码就明白了:N_m3u8DL-RE 用 mkvmerge 混流时,会给每一轨拼一个--language 0:"xxx"参数(MuxInputsByMkvmerge)。这个案例发生时,老版本遇到无法识别的流语言代码会原样透传,报错必然发生。
先试这个:5秒搞定的修法
① 更新到最新构建。维护者已在新版本里修掉这个问题:识别不了的语言代码现在会被统一转成und(意思是"未知"),不再原样丢给 mkvmerge,转换逻辑在 LanguageCodeUtil。如果你手上是旧版,直接换成新构建即可;也可以自己拉代码构建:
git clone https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE② 换回 ffmpeg 混流器。项目的默认混流器其实是 ffmpeg,它对语言标签要宽容得多,这种非法代码不会让它报错。你原来如果写的是-M format=mkv:muxer=mkvmerge,把 muxer 那段去掉就行:
-M format=mkv容器还是 MKV,马上就能拿到混流结果。
得动手改:手动修语言标签
如果非要用 mkvmerge(或者你遇到的是别的 mkvmerge 报错),这么办:
- 加
--log-level DEBUG重跑,从日志里拿到 mkvmerge 的完整命令行 - 把命令行复制出来手动执行,复现报错
- 把命令里的
--language 0:tm改成有效代码,比如--language 0:vie(越南语),再跑通 - 代码怎么查?LanguageCodeUtil.cs 里的映射表左侧两字母、右侧三字母,如
vi;vie、tr;tur,对照着填
⚠️ 手动改命令只能救当这一次混流。想一劳永逸,还是用新构建版本。
同类坑还可能藏在哪
如果源流还有别的非标准语言代码,或你通过--mux-import混入外部音频、字幕文件,同样的校验还会再咬你一次。经验就一条:碰到mux failed,先用 DEBUG 日志把第三方工具的完整命令行抓出来——它直接告诉你卡在哪,原因十有八九出在某个参数上。
【免费下载链接】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),仅供参考