在不重新编码的情况下从 H.264 中删除 EIA-608 隐藏式字幕

Removing EIA-608 Closed Captions from H.264 without reencode

我希望在不重新编码的情况下从 H.264 视频(包含为 mkv)中删除隐藏式字幕 (EIA-608)。

我最接近的是使用 ffmpeg:

    ffmpeg -f lavfi -i movie=input.mkv[out+subcc] -map 0:0 output.mkv

为了将视频分离成rawvideo和subrip组件,导出rawvideo。然而,这会导致文件接近 200GB,这并不是真正可持续的解决方案。

基于 ffmpeg 的解决方案会更好,但我可以使用任何必要的软件。

这实际上可以使用比特流过滤器。据我所知,这是我自己发现的,因为我看过的所有地方都应该不受支持。

首先要了解的是,对于 EIA-608 和类似的隐藏式字幕标准,字幕作为用户数据直接嵌入到视频比特流中。 H.264 比特流存储为一系列 NAL(网络抽象层)单元。每个单元都有一个类型;用户数据存储在补充增强信息(SEI)类型的NAL单元中。

事实证明,ffmpeg 有一个名为 filter_units 的比特流过滤器,它允许您按类型 通过或拒绝 NAL 单元 。所以我们可以用它来删除所有的 SEI NAL 单元,从而去掉标题。

filter documentation for filter_units says that we have to specify the types by number. According to the latest H.264 spec (Table 7-1), SEI 单元的类型为 6.

因此,以下命令将删除嵌入的隐藏式字幕:

ffmpeg -i input.mkv -codec copy -bsf:v "filter_units=remove_types=6" output.mkv

这对我来说对几个文件都有效,没有任何问题或副作用。