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

Jac*_*nds 5 ffmpeg h.264 captions

我想要从H.264视频(包含为mkv)中删除隐藏式字幕(EIA-608),而无需重新编码.

我最接近的是使用ffmpeg:

    ffmpeg -f lavfi -i movie=input.mkv[out+subcc] -map 0:0 output.mkv
Run Code Online (Sandbox Code Playgroud)

为了将视频分成rawvideo和subrip组件并导出rawvideo.然而,这导致文件接近200GB,这实际上不是一个可持续的解决方案.

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

小智 9

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

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

事实证明,ffmpeg有一个名为bitstream的过滤器filter_units,它允许你按类型传递或拒绝NAL单元.因此我们可以使用它来删除所有SEI NAL单元,这将删除字幕.

过滤器文件filter_units说,我们必须用数字来指定类型.根据最新的H.264规范(表7-1),SEI单元具有类型6.

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

ffmpeg -i input.mkv -codec copy -bsf:v "filter_units=remove_types=6" output.mkv
Run Code Online (Sandbox Code Playgroud)

这对我有几个文件没有任何问题或副作用.

  • 如何让 ffmpeg 看到 EIA 字幕?我正在尝试 ffmpeg -i 和 ffprobe 但它根本不显示字幕! (2认同)