我希望能够在不重新编码的情况下,从H.264视频(包含在mkv文件中)中删除关闭字幕(EIA-608)。
最接近的方法是使用ffmpeg:
ffmpeg -f lavfi -i movie=input.mkv[out+subcc] -map 0:0 output.mkv
为了将视频分离为原始视频和SubRip组件,并导出原始视频。然而,这将产生近200GB的文件,这不是一个可持续的解决方案。
基于ffmpeg的解决方案会更好,但我可以使用任何必要的软件。
我希望能够在不重新编码的情况下,从H.264视频(包含在mkv文件中)中删除关闭字幕(EIA-608)。
最接近的方法是使用ffmpeg:
ffmpeg -f lavfi -i movie=input.mkv[out+subcc] -map 0:0 output.mkv
事实上,使用比特流过滤器是可以实现的。据我所知,这是我自己发现的,因为到处都说不支持这个功能。
首先要明白的是,对于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
这在我多次处理文件时都能有效运行,而且没有出现任何问题或副作用。
filter_units
解决方案对我有效。谢谢。 - AntumDeluge我在尝试从NTSC DVD的MPEG-2视频中删除关闭字幕时遇到了这篇文章。 filter_units=remove_types=6
没有起作用,实际上导致一个厚厚的黑色水平条出现,可能是因为关键视频信息被删除,因为编解码器不同。经过一些实验,我发现 remove_types=178
起作用了。
我想为任何试图在未来实现相同目标的人发布此帖子。我本来想在答案上评论,但我没有必要的声望。