FFmpeg提取章节时丢失语言标识(en)的原因及解决方法
嘿,这个问题我之前也碰到过,其实是FFmpeg的ffmetadata格式特性在搞鬼~
为什么会丢失en:标识?
原来的MKV文件里,章节的语言信息(en:)是作为单独的元数据属性存储的,和章节标题是分开的字段。但当你用ffmpeg -i input.mkv -f ffmetadata FFMETADATAFILE.txt命令提取时,FFmpeg的ffmetadata格式本身并不支持保留这种语言标记,它会自动把章节标题当成纯文本输出,直接剥离掉en:前缀,所以你看到的提取结果就没有语言标识了。
解决方法有这三种,按需选就行:
方法1:导出XML格式保留完整元数据
如果你想完整保留章节的语言属性(不是硬写到标题里),换用XML格式导出更靠谱,命令如下:ffmpeg -i input.mkv -f ffmetadata -print_format xml chapters.xml导出的XML文件会明确把语言作为单独的标签存储,比如:
<chapter> <start>0</start> <end>422083000</end> <tag key="language" value="en"/> <tag key="title" value="Chapter 01"/> </chapter>后续要恢复到视频里也能基于这个XML文件操作,完全保留原始元数据结构。
方法2:手动补全后导回
如果只是想让标题里显示en:前缀,直接手动编辑提取后的FFMETADATAFILE.txt,把每个章节标题改成en:Chapter XX的格式就行。之后用下面的命令把修改后的元数据导回视频:ffmpeg -i input.mkv -i FFMETADATAFILE.txt -map_metadata 1 -c copy output.mkv这种方式是把语言标识硬写到标题里,和原文件的元数据结构不一样,但视觉上和你想要的效果一致。
方法3:用MKVToolNix工具精准处理
要是你经常折腾MKV的章节,MKVToolNix绝对是神器。用它的mkvextract命令可以完整导出带语言标识的章节:mkvextract chapters input.mkv chapters.txt导出的文件格式和你看到的原始菜单几乎一样:
CHAPTER01=00:00:00.000 CHAPTER01NAME=en:Chapter 01 CHAPTER02=00:07:02.083 CHAPTER02NAME=en:Chapter 02之后用
mkvmerge就能轻松把这个章节文件导回视频,完美保留原始的语言标记。
备注:内容来源于stack exchange,提问作者paperskyline

