我检查了FFMpeg文档和许多论坛,并找出正确的命令行来从.MP4视频中提取字幕应如下所示:
ffmpeg -i video.mp4 -vn -an -codec:s:0 srt out.srt
但是,我收到以下错误,这让我怀疑这是否可行:
打开输出流#0的编码器时出错:0 - 可能是不正确的参数 例如bit_rate,rate,width或height
使用ffmpeg -codecs
,我可以确认ffmpeg应该能够对subrip字幕进行编码。
使用ffmpeg -i video.mp4
,我可以看到视频中嵌入了两个字幕轨道:
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)
修改
我已经使用评论中显示的简化命令行进行了测试,但我仍然遇到了同样的错误。这是运行命令的a link to the detailed verbose output。我还尝试在结果输出中完全禁用元数据和章节,但仍然会产生相同的错误。
答案 0 :(得分:22)
我最终想出了为什么我没有成功:
如果源视频中的字幕以基于文本的表示形式编码,则指定的命令行将完全正常。但是,从输出到ffmpeg -i
命令行可以看出,字幕以“dvd_subtitle”格式编码。
dvd_subtitle格式存储视频中每个字幕的位图。因此,ffmpeg无法将位图转换为文本。
对于此任务,必须使用基于OCR的软件,该软件协助用户将每个字幕识别为其位图重新呈现的文本。
(源视频中有一个辅助的基于文本的字幕,但我不知道它来自哪里,并且大多数热门玩家都看不到。就所有意图和目的而言,这个“mov_text”字幕似乎是存根占位符,可能是原始DVD转换的工件)
答案 1 :(得分:4)
仅供参考,(由于还不能发表评论),但从MP4中提取SRT将导致格式化为MOV_Text的文件不是常规SRT。它仍然会被添加和工作,但它就像将mp4改为m4v。虽然它通常有效,但代码中的功能不同。 Mov_text对于手动调整字体/大小等非常糟糕。最好的办法是从网上下载并测试SRT!
这样可以,但会产生mov_text编码的srt文件:
ffmpeg -i in.mp4 out.srt
答案 2 :(得分:1)
尝试使用地图选项... 如果输入文件中有太多的流....
语法将是:
ffmpeg -i video.mp4 -map 0:4 out.srt
由于您的视频中有两个字幕流,首先是0:3,这是dvdsubtitle所以无法转换为srt所以我们将在0:4流上转换第二个字幕,这是mov_text并且是字幕的软拷贝所以可以是容易转换....