2013-12-19 158 views
10

我检查了FFmpeg的文档和许多论坛,并计算出正确的命令行来从.MP4视频中提取的字幕看起来应该像这样:是否可以使用ffmpeg从MP4视频中提取SubRip(SRT)字幕?

ffmpeg -i video.mp4 -vn -an -codec:s:0 srt out.srt 

不过,我得到下面的错误,这使它我质疑是否可行在所有:

错误而输出流#0开口编码器:0 - 也许不正确的参数 如BIT_RATE,速率,宽度或高度

使用ffmpeg -codecs,我可以确认ffmpeg应该能够编码子标题字幕。

使用ffmpeg -i video.mp4,我可以看到,有嵌入在视频2个字幕轨道:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4': 
... 
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1/0x31637661), yuv420p, 720x572 [SAR 64:45 DAR 256:143], 1341 kb/s, 25 fps, 25 tbr, 90k tbn, 180k tbc 
Stream #0:1(eng): Audio: aac (mp4a/0x6134706D), 48000 Hz, stereo, fltp, 191 kb/s 
Stream #0:2(fra): Audio: aac (mp4a/0x6134706D), 48000 Hz, stereo, fltp, 191 kb/s 
Stream #0:3(eng): Subtitle: dvd_subtitle (mp4s/0x7334706D) 
Stream #0:4(und): Subtitle: mov_text (text/0x74786574) 

EDIT

我与评价,但我所示的简化的命令行测试仍然会得到相同的错误。这里是a link to the detailed verbose output运行命令。我也尝试完全禁用结果输出中的元数据和章节,但仍然产生相同的错误。

+3

简单的'ffmpeg -i in.mp4 out.srt'正确工作。 (ffmpeg 2.0.1) – pogorskiy

+0

尝试'ffmpeg ... -loglevel debug ...'以获取有关错误的更多信息 – pogorskiy

+0

我已经尝试了这两个建议,但我无法确定一个明显的错误。也许这是由ffmpeg试图在生成的srt文件中输出章节标记引起的?我已经包含了详细的调试输出。 –

回答

22

我enventually想通了,为什么我没有成功:

指定的命令行本来是完全正常的,如果从视频信号源字幕的基于文本的表示进行编码。但是,从输出到ffmpeg -i命令行的输出中可以看出,字幕以“dvd_subtitle”格式编码。

dvd_subtitle格式存储视频中每个字幕的位图。因此,ffmpeg无法将位图转换为文本。

对于这项任务,人们不得不求助于基于OCR的软件,该软件协助用户将每个字幕标识为来自其位图再现的文本。

(在源视频中有一个辅助的基于文本的字幕,但我不知道它来自哪里,也没有被大多数流行的播放器看到,对于所有意图和目的,这个“mov_text”字幕似乎是一个存根占位符,可能是从原始DVD转换的人工制品)

+0

我认为文本轨道是章节标记,但不知道。 – mcdado

4

仅供参考,(由于代表尚未评论),但从MP4中提取SRT将导致文件格式化为MOV_Text而不是定期SRT。它仍然会被添加和工作,但它像改变mp4到m4v一样。虽然它通常起作用,但代码中的工作并不一样。 Mov_text对于手动调整字体/大小等是非常可怕的。最好的办法是从网上下载并测试SRT!

这是可行的,而且会造成mov_text编码SRT文件:

ffmpeg -i in.mp4 out.srt 
0

尝试使用地图选项... 如果在输入文件流太多....

语法将是:

ffmpeg -i视频。MP4 -Map 0:4 out.srt

因为有您的两个视频的字幕流,第一个0:3这是dvdsubtitle所以不能转换为SRT,所以我们将其转换0第二子标题:4流这是mov_text和副标题的软副本,所以可以很容易地转换....

相关问题