无法使用ffmpeg更改视频字幕编解码器

10

我有一个包含若干嵌入式流的mkv文件:

Stream #0:0: Video: h264 (High), yuv420p(tv, smpte170m/smpte170m/bt709), 720x300, SAR 1:1 DAR 12:5, 25 fps, 25 tbr, 48003.07 tbn, 50 tbc (default)
Stream #0:1(tr): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s (default)
Stream #0:2(fr): Subtitle: dvd_subtitle, 720x300

在我的电脑上播放时,我可以看到字幕。但是从我的旧DVD/DIVX播放器播放时,我无法看到字幕(其他mkv/avi正常工作)。

所以我想更改字幕编码,看看是否有另一种编码可以在我的DVD播放器上使用。

ffmpeg -encoders 报告:

 S..... ssa                  ASS (Advanced SubStation Alpha) subtitle (codec ass)
 S..... ass                  ASS (Advanced SubStation Alpha) subtitle
 S..... dvbsub               DVB subtitles (codec dvb_subtitle)
 S..... dvdsub               DVD subtitles (codec dvd_subtitle)
 S..... mov_text             3GPP Timed Text subtitle
 S..... srt                  SubRip subtitle (codec subrip)
 S..... subrip               SubRip subtitle
 S..... text                 Raw text subtitle
 S..... webvtt               WebVTT subtitle
 S..... xsub                 DivX subtitles (XSUB)

所以我尝试了:

ffmpeg -i input.mkv -acodec copy -vcodec copy -scodec "codec" converted.mkv

有各种版本的"codec"。它们都不起作用(除了原始的dvdsub...):

xsub报告:

[matroska @ 0x24558c0] Subtitle codec 94211 is not supported.
av_interleaved_write_frame(): Function not implemented
[matroska @ 0x24558c0] Subtitle codec 94211 is not supported.
Error writing trailer of mustang_converted.mkv: Function not implementedframe=  244 fps=0.0 q=-1.0 Lsize=       1kB time=00:00:10.01 bitrate=   1.0kbits/s speed=1.23e+03x    
video:321kB audio:235kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Conversion failed!

ssa或ass报告:

[ssa @ 0x262e000] Only SUBTITLE_ASS type supported.
Subtitle encoding failed

其他人的报告:

Error while opening encoder for output stream #0:2 - maybe incorrect parameters such as bit_rate, rate, width or height

我做错了什么?有些字幕编解码器与当前的视频或音频编解码器不兼容吗?我应该改变它们而不是复制它们吗?

另外,是否有选项将字幕合并到视频图像流中以永久保存(然后只有两个输出流:音频和视频,但保留字幕显示)?

注意:如果在Linux(mint)下工作,则可以使用其他工具回答。


1
给新读者的提示:这个问题不是 Stack Overflow 的主题。请参阅 帮助页面,特别是名为“我可以在这里问什么样的话题?”和“我应该避免问哪些类型的问题?”的部分。 - Some programmer dude
1个回答

17

您的字幕是基于图像的,需要转换为文本格式,例如SRT。 使用Subtitle Edit或类似工具导入MKV中的字幕。这将进行OCR处理。 处理完成后,保存为SRT或任何常见的基于文本的字幕格式。

然后使用您选择的scodec运行ffmpeg命令。


或者,如果您想要将字幕烧录到视频中,可以尝试以下方法之一。

ffmpeg -i input.mkv -vf subtitles=input.mkv -acodec copy -sn converted.mkv
或者
ffmpeg -i input.mkv -filter_complex "[0:v:0][0:2]overlay" -acodec copy -sn converted.mkv

2
无法在Linux下使用Subtitle Edit。您的第一个ffmpeg命令失败,出现错误“当前仅支持基于文本的字幕”,但第二个命令成功了(视频质量降低,文件输出大小减小了3倍...但是字幕可以正常工作!)。谢谢。 - jpo38
您可以插入“-crf 20”以提高视频质量。 - Gyan
会尝试一下。再次感谢您的帮助。 - jpo38
顺便问一下,您能在帖子中解释一下这个神奇的“filter_complex”参数是什么意思吗? - jpo38
我正在编写一个脚本,用于在Ubuntu上由Plex Media Server使用的自动化mkv转mp4转换。我遇到了这个问题。我希望ffmpeg忽略错误,并且如果出现此类问题,则只需丢弃替代流。如何实现? - dacabdi
3
你需要使用两个命令:a) ffmpeg -i in.mkv -map 0:s sub.mp4 b) 检查sub.mp4是否存在且大小不为零(或者检查cmd a的退出代码是否成功)。如果不存在或大小为零,则执行ffmpeg -i in.mkv -c copy -sn out.mp4。如果存在且大小不为零,则执行ffmpeg -i in.mkv -c:v copy -c:a copy out.mp4 - Gyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接