FFmpeg移除字幕时无法保留MKV文件中Chapter Atoms的问题求助
我手里有一批从The Criterion Collection转码来的视频,这些视频里有一种叫chapter atoms的章节信息,但奇怪的是ffprobe根本检测不到它们。我猜chapter atoms应该是H.264/H.265/MP4/MOV这类格式里的东西,但Matroska容器本身应该有自己的章节元数据规范吧?这点我不太确定...
举个例子,当我执行ffprobe -show_chapters <video file>时,它只返回一个章节,内容如下:
[CHAPTER] id=0 time_base=1/1000000000 start=7235652000000 start_time=7235.652000 end=7235652000000 end_time=7235.652000 TAG:title=XXXXXX [/CHAPTER]
但用MKVToolNix GUI的“信息工具”打开时,在最底部有个可折叠的“Chapters”选项,展开到“Edition entry”后,能看到诸如“Edition flag hidden”、“Edition flag default”、“Edition UID”,最后还有多个Chapter atoms条目。这些内容用ffmpeg/ffprobe常规方式根本检测不到。
现在我想解决的问题是:我写了一个用ffmpeg的脚本,想保留原视频的所有数据,只移除字幕。脚本内容如下:
#!/bin/sh if [ $# -eq 0 ]; then >&2 echo "Error: No filename(s) specified." exit 1 fi # TODO: Sometimes it does not copy over chapter info for f in "$@"; do ffmpeg -i "$f" -threads 4 \ -c:v copy -c:a copy -sn \ -map 0 -map_metadata 0 -map_chapters 0 \ -movflags use_metadata_tags \ "${f%.*}-subs-removed.${f##*.}" done
我这么做主要是强迫症使然——我一直偏好字幕单独存放,原因有很多:
- 有时候字幕里有错误或格式问题需要修正
- OCR转换的错误要改
- 要去掉字幕里烦人的第三方网站版权水印
- 调整字幕的时序、同步和时长
- 方便其他人转译成其他语言
- 转换字幕格式
我觉得自己已经做了能做的一切来保留原文件的所有数据(包括元数据),但ffmpeg似乎没法完全满足我的需求,它总是会漏掉一些应该被复制的自定义标签和元数据。
所以ffmpeg是不是不适合做这个工作?看起来mkvtoolnix里的mkvextract能检测并提取这些chapter atoms,但ffmpeg不行,这是为什么呢?
有没有办法把chapter atoms转换成标准的Matroska章节?我想要自动化的方案,因为我已经有几个shell脚本(ffmpeg-subs-remove.sh和ffmpeg-subs-extract.sh),上面贴的是移除字幕的脚本,要是能让它正常工作就太好了。
备注:内容来源于stack exchange,提问作者mrjpaxton

