从H.264中删除EIA-608闭路字幕而无需重新编码

11

我希望能够在不重新编码的情况下,从H.264视频(包含在mkv文件中)中删除关闭字幕(EIA-608)。

最接近的方法是使用ffmpeg:

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

为了将视频分离为原始视频和SubRip组件,并导出原始视频。然而,这将产生近200GB的文件,这不是一个可持续的解决方案。
基于ffmpeg的解决方案会更好,但我可以使用任何必要的软件。

目前使用ffmpeg无法实现 - https://trac.ffmpeg.org/ticket/5283 - Gyan
我假设你的字幕是CEA-608(而不是EIA-618)。请提供一个样本文件。你的字幕可以嵌入到H.264流中(通过SEI),或者你的字幕可以在MKV容器内作为单独的流存在。 - Markus Schumann
你说得对,它们是608,我编辑了问题以更正我的错误。 我已经上传了一个简短的剪辑到Mega - Jackson Edmonds
2个回答

27

事实上,使用比特流过滤器是可以实现的。据我所知,这是我自己发现的,因为到处都说不支持这个功能。

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

事实证明,FFmpeg有一个名为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

这在我多次处理文件时都能有效运行,而且没有出现任何问题或副作用。


1
运行得非常好。非常感谢 <3 - Jackson Edmonds
2
我该如何让ffmpeg看到EIA字幕?我尝试了使用ffmpeg -i和ffprobe,但根本没有显示出字幕! - Freedo
未知的比特流过滤器filter_units在ffmpeg版本3.4.4-1中需要4+。 - Freedo
我尝试通过将视频和音频输出到不同的文件中来删除CC1/EIA-608。运行每个文件通过MediaInfo,都没有显示出闭路字幕轨道。所以我认为这是成功的。然后我将视频和音频混合在一起成为一个新的MP4文件,但在MediaInfo中仍然显示了CC轨道。最终,filter_units解决方案对我有效。谢谢。 - AntumDeluge
太棒了!而且速度真的非常快。 - Anders

1

我在尝试从NTSC DVD的MPEG-2视频中删除关闭字幕时遇到了这篇文章。 filter_units=remove_types=6 没有起作用,实际上导致一个厚厚的黑色水平条出现,可能是因为关键视频信息被删除,因为编解码器不同。经过一些实验,我发现 remove_types=178 起作用了。

我想为任何试图在未来实现相同目标的人发布此帖子。我本来想在答案上评论,但我没有必要的声望。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接