从 H.264 中删除 EIA-608 隐藏式字幕而不重新编码

问题描述 投票:0回答:3

我希望从 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 的解决方案会更好,但我可以使用任何必要的软件。

ffmpeg h.264 captions
3个回答
29
投票

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

首先要了解的是,对于 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
投票

我在尝试从 MPEG-2 视频(来自 NTSC DVD)中删除隐藏式字幕时看到了这篇文章。

filter_units=remove_types=6
不起作用,实际上导致出现一个粗的黑色水平条,大概是因为编解码器不同而删除了重要的视频信息。经过一些实验,我发现
remove_types=178
有效。

我想我会在这里发帖给任何其他试图在未来实现同样目标的人。我只想对答案发表评论,但我没有这样做所需的声誉。


0
投票

对于任何想要使用 h265 进行此操作的人

remove_types=39

需要注意的是,对于 AVC/HEVC,SEI 还用于 HDR10+ 等其他信息,因此使用此功能将导致元数据被删除,目前存在关于此问题的开放票证。因此,如果您不想丢失 HDR,那么最好不要删除隐藏字幕。

https://trac.ffmpeg.org/wiki/HowToExtractAndRemoveClosedCaptions

© www.soinside.com 2019 - 2024. All rights reserved.