可以ffmpeg提取隐藏字幕数据

时间:2010-07-03 01:11:52

标签: ffmpeg

我目前正在使用ffmpeg将各种格式的视频转换为flv文件。还提出了一个请求,即从文件中获取隐藏字幕信息。有没有人有这方面的经验或知道它甚至可以做到。我没有看到它的任何选项,但我想我会问。看看。

8 个答案:

答案 0 :(得分:15)

如果像我一样的任何人最终都在这个帖子上,这里有一个更详细的解释ffmpeg命令对我有用。

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

源代码似乎要求mpegts格式(文件扩展名.ts)。否则,lavfi过滤器似乎不起作用。规范out+subcc强制ffmpeg将隐藏式字幕(嵌入到帧数据中)视为单独的流。稍后-map 0:1会使ffmpeg仅映射该流,并丢弃其他所有内容。结果将保存到output.srt。根据您的输入,映射可能会有所不同。找出隐藏式字幕映射的一种简单方法是运行ffprobe命令,如此

$ ffprobe -f lavfi -i movie=input.ts[out+subcc]
ffprobe version N-79653-g4efd3ec Copyright (c) 2007-2016 the FFmpeg developers
  libavutil      55. 22.101 / 55. 22.101
  libavcodec     57. 38.100 / 57. 38.100
  libavformat    57. 34.103 / 57. 34.103
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 44.100 /  6. 44.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
[h264 @ 0x7fe869826200] Increasing reorder buffer to 1
Input #0, lavfi, from 'movie=input.ts[out+subcc]':
  Duration: N/A, start: 1562.233011, bitrate: N/A
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 90k fps, 30 tbr, 90k tbn
    Stream #0:1: Subtitle: eia_608

Subtitle: eia_608有“索引”0:1,因此应该映射。

很少有分手记录,ffmpeg-f lavfi的参数顺序必须在-i move=...之前,否则规格将无法识别。此功能也是最新版本,因此请仔细检查ffmpeg版本并根据需要进行升级。

答案 1 :(得分:8)

隐藏式字幕为2格式
1)ATSC美国标准(支持在ffmpeg中)
2)ISDB日本标准(ffmpeg中没有支持)

您可以使用以下命令

ffmpeg -f lavfi -i "movie=test.ts[out0+subcc]" -map s output.srt

这个东西最近开发了所以请查看你的版本 FFMPEG。

答案 2 :(得分:2)

为了获得字幕而不是任何元垃圾,我发现了

ffmpeg -i input.mov -an -vn -bsf:s mov2textsub -scodec copy -f rawvideo sub.txt 

最适合我。

答案 3 :(得分:2)

我用它从.mp4文件中提取CC608隐藏式字幕:

对于%% F IN(* .mp4),请执行ffmpeg -f lavfi -i movie =“ %% F” [out + subcc] -map 0:1 -y“ %%〜nF.srt”

答案 4 :(得分:1)

如果标题作为单独的流包含在内,那么提取它们是(相对)直截了当的:

ffmpeg -i input.mov -an -vn -c:s copy -f rawvideo -map 0:s sub.txt

如果它在视频文件中被“烧毁”,那么你可能会运气不好,但是对于字幕来说,这比通常使用隐藏式字幕更常见。

答案 5 :(得分:0)

隐藏式字幕不是单独的流,也不是它们被烧成图片,它们在图片中的扫描线中交织 - 这是一个奇怪的美国想法,并没有在其他地方使用过。虽然你可以购买有这种字幕的DVD,但通常美国以外的人都看不到字幕,甚至可能都不知道文件中有一些。

CCExtractor可以通过查看TS元数据从VOB中提取此信息:http://ccextractor.sourceforge.net/

答案 6 :(得分:0)

这取决于您正在使用哪种输入文件。就我而言,我有一个带有Scenarist(.scc)风格eia-608轨道的Final Cut Pro MOV Master文件。尽管ffmpeg可以从mpeg2传输流文件中提取嵌入的隐藏式字幕,但它不能在单独的轨道上处理eia-608数据。

ccextractor应该可以解决问题,但是MOV会围绕Apple产品运行,有时会完全无视第三方而移动...因此,您应该在处理MOV文件之前对其进行标准化...一个简单的ffmpeg -i my.mov -c copy -map 0 out.mov应该做到这一点。然后CCExtractor内置的MP4Box构建应该能够通过它的eia轨道并将其解码为可用的东西,例如vtt。

来源:https://trac.ffmpeg.org/ticket/7694

答案 7 :(得分:0)

ColdLearning的答案适用于ffmpeg 4.1.4的mp4文件,但会生成很多元标记作为字幕的一部分。

Heshy的mp4文件失败,因为它找不到任何字幕流。

此mp4文件在VLC上不显示任何字幕,并且ffmpeg和mp4box都未将字幕列为流,但是Handbrake确实将字幕轨道检测为隐藏式字幕(CC608)。

因此,如果有人像我确实知道的那样经过大量搜索后偶然发现了这一点,那么以后需要使用正则表达式进行清理。