我目前正在使用ffmpeg将各种格式的视频转换为flv文件。还提出了一个请求,即从文件中获取隐藏字幕信息。有没有人有这方面的经验或知道它甚至可以做到。我没有看到它的任何选项,但我想我会问。看看。
答案 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。
答案 7 :(得分:0)
ColdLearning的答案适用于ffmpeg 4.1.4的mp4文件,但会生成很多元标记作为字幕的一部分。
Heshy的mp4文件失败,因为它找不到任何字幕流。
此mp4文件在VLC上不显示任何字幕,并且ffmpeg和mp4box都未将字幕列为流,但是Handbrake确实将字幕轨道检测为隐藏式字幕(CC608)。
因此,如果有人像我确实知道的那样经过大量搜索后偶然发现了这一点,那么以后需要使用正则表达式进行清理。