如何使用ffmpeg从视频中提取字幕?

vij*_*jay 53 ffmpeg extract subtitles

我试图从视频中提取字幕作为.srt文件,我使用了以下命令:

FFMPEG -i mytestmovie.mkv -vn -an -codec:s:0.1 srt sub.srt
Run Code Online (Sandbox Code Playgroud)

但是,我收到了一个错误为无法识别的选项codec:s:0:1 那么,你能告诉我确切的命令以及如何.srt在视频中将字幕提取为文件吗?

jm3*_*jm3 93

简单的:

ffmpeg -i Movie.mkv -map 0:s:0 subs.srt
Run Code Online (Sandbox Code Playgroud)
  • -i:输入文件 URL/路径。
  • -map:指定一个或多个输入流作为输出文件的源。
  • s:0 : 选择字幕流。

  • 这将下载第一个字幕轨道。如果有多个,使用 `0:s:1` 下载第二个,使用 `0:s:2` 下载第三个,依此类推。 (20认同)
  • 要一次提取更多字幕,您必须为每个文件复制 `-map` 参数。还包括`-c copy`,以便它只提取文件而不尝试处理它:`ffmpeg -i Movie.mkv -c copy -map 0:s:0 subs.01.srt -c copy -map 0:s :1 subs.02.srt`。无论如何,这需要很长时间,因为 ffmpeg 必须读取整个视频文件才能找到字幕流的所有部分。 (6认同)
  • @jm3 您是否碰巧知道从文件中自动提取所有字幕流的方法,并以它们的语言标识符(例如 eng、fre、dut 等)命名它们? (5认同)
  • 这对带有嵌入字幕的 MP4 文件对我有用。 (3认同)
  • @x-yuri FFMPEG 的默认操作是处理(转换)输入上的所有内容。这意味着如果您不使用“-c”参数,它将自动选择编解码器(或字幕的输出格式 - FFMPEG 实际上可以转换字幕格式!)并处理它。将 SRT 转换为 SRT 看起来可能没问题,但如果输入文件包含错误或未知的内容(编码错误、时间码拼写错误、字幕重叠或太短等),则可能会弄乱输入文件。因此,如果想要输入的 100% 副本,您应该始终包含“-c copy”。 (2认同)

evi*_*oup 10

-codec:s:0:1是不正确的。如果您使用,-codec:s:0则 ffmpeg 将使用规定的编解码器用于传递到输出的第一个字幕流,如果您使用,-codec:s:1则它将用于第二个字幕流,依此类推。

您还可以使用-codec:s选择所有输出字幕流,或-codec:2选择第三个输出流,无论它是什么。

您可能会感到困惑,因为该-map选项的行为方式不同 - 在那里,您必须选择所选流来自哪个输入。(因此,-map 0:s:0将从第一个输入中获取第一个字幕流,并将其提供给输出)。但是,-map用于选择要从输入中获取哪些流;而使用流映射的大多数其他选项在被选择后用于流(因此无需指定它们来自哪个输入文件),因为它们被传递到输出。

  • 尝试:`ffmpeg -i E:\Routine\routine.mkv -map 0:s:0 E:\Routine\sub.srt`(ffmpeg 应该从输出文件名中检测到你想要 srt 字幕) (2认同)

Ber*_*ala 5

ffmpeg -i video.mkv subs.srt
Run Code Online (Sandbox Code Playgroud)

很邪恶吧?

刚刚为我工作,为一堆包含单个 SRT 流的 MKV。显然这是默认行为。我的 ffmpeg 版本是 20170516,来自 ubuntu 16.4


Pav*_*sov 5

情况 1 - 视频中的单个字幕:

# as by Berry Tsakala
> ffmpeg -i video.mkv subs.srt
Run Code Online (Sandbox Code Playgroud)

情况 2 - 多个字幕:

> ffprobe video.mkv
Stream #0:0(eng): Video: h264 (Main)...
Stream #0:1(rus): Audio: ac3, 48000 Hz...
Stream #0:2(eng): Audio: eac3, 48000 Hz...
Stream #0:3(rus): Subtitle: subrip
Stream #0:4(eng): Subtitle: subrip <-- wanted subs
Stream #0:5(eng): Subtitle: subrip
Stream #0:6(eng): Subtitle: subrip
Run Code Online (Sandbox Code Playgroud)

然后如果你想要流0:4,那么只需使用0:4

ffmpeg -i video.mkv -map 0:4 subs.srt
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这个0:s:0概念对我来说看起来毫无用处,因为它让我们在头脑中进行计算。