ffmpeg转mkv到mp4,压制字幕报错
根本原因:MKV 的“大杂烩”属性与 MP4 的“严格标准”产生了剧烈冲突。
复杂的蓝光 MKV 结构:像您下载的这种带有 BluRay、DTS 标签的蓝光原盘压制版 MKV,它通常不只有“一段视频 + 一段声音”。为了原汁原味,压制组往往会在里面塞入:
多条视频流(比如主电影是第1条视频流,但文件里还嵌了一张电影海报作为第2条视频流)。
特殊的软字幕(如 PGS 图形字幕、ASS 特效字幕)。
附件数据 Data(比如为了特效字幕打包进去的几十个特殊字体文件)。
FFmpeg 的愚蠢默认行为:当我们的脚本触发大于 2GB 的“高压重编码”流程时,调用了 ffmpeg 将其转为 MP4。在没有明确指定挑哪些轨道的情况下,ffmpeg 会试图把 MKV 里的所有轨道和附件原封不动地塞进 MP4。
MP4 容器的严厉拒绝:MP4 格式的标准非常严格,它根本不支持封装 PGS 图形字幕和乱七八糟的字体附件数据!当 FFmpeg 试图强塞时,MP4 容器会直接报致命错误,导致 FFmpeg 瞬间崩溃退出。最终脚本就会判定:“视频转码处理失败,无法生成标准 MP4”。
要彻底根治这个问题,我们需要在 底层 FFmpeg 转码指令中,加入一组“强制纯净化隔离”参数,只提取我们需要的精华,丢弃所有导致报错的垃圾流。
方案细节(将在转码核心逻辑中增加以下指令):
增加 -map 0:v:0:强行规定只提取第 1 条主视频流(丢弃导致报错的海报视频流)。
增加 -map 0:a:0:强行规定只提取第 1 条主音轨(将其从 DTS 转为兼容性最好的 AAC)。
增加 -sn:彻底剔除并丢弃所有的软字幕轨(因为如果您选了要字幕,系统已经把中文字幕作为像素“硬烧录”到画面上了,留着软字幕不仅没用,还会让 MP4 报错)。
增加 -dn:彻底剔除所有的字体附件和杂项 Data 数据。