ffmpeg 在一个命令中剪切视频和刻录字幕

ffmpeg cut video and burn subtitle in a single command

我想从视频中剪出一段,然后在里面刻录字幕。

我可以通过 3 个步骤完成此操作:

  1. 剪视频
    ffmpeg -ss 25:00 -to 26:00 -i vid.mp4 -c copy out.mp4

  2. 切字幕
    ffmpeg -i sub.srt -ss 25:00 -to 26:00 out.srt

  3. 在视频中刻录字幕
    ffmpeg -i out.mp4 -vf subtitles=out.srt -c:a copy -y final.mp4

但我想在单个 ffmpeg 命令中执行此操作。

如果我这样做
ffmpeg -ss 25:00 -to 26:00 -i vid.mp4 -vf subtitles=sub.srt -c:a copy -y final.mp4
视频被剪切但没有刻录字幕。
这很快。

如果我这样做
ffmpeg -i vid.mp4 -ss 25:00 -to 26:00 -vf subtitles=sub.srt -c:a copy -y final.mp4
视频被剪切并正确刻录了字幕,但在开始编写最终.mp4 时出现延迟。
我认为 ffmpeg 从一开始就处理 vid.mp4 直到它到达 -ss 时间(并删除那部分) 然后继续处理写入final.mp4

有没有办法在单个 ffmpeg 命令中快速完成此操作?
像 ffmpeg 直接去 -ss 时间然后剪切,处理它,在里面刻录字幕。

谢谢

是的,字幕过滤器在内部打开字幕文件并且不知道视频的搜索点,因为 ffmpeg 在搜索后重置时间戳。

因此请保留源时间戳,然后重新设置它们,即

ffmpeg -ss 25:00 -to 26:00 -copyts -i vid.mp4 -vf subtitles=sub.srt  -c:a copy -ss 25:00 -y final.mp4

字幕作为单独的流(就像视频和音频一样)。您需要指定要复制的流。假设视频是 Stream #0:0,音频是 Stream #0:1,字幕是 Stream #0:2,命令将是

ffmpeg -ss 25:00 -to 26:00 -i vid.mp4 -c copy -map 0:0 -map 0:1 -map 0:2 out.mp4

您可以使用 ffprobe:

查询现有流
ffprobe -i vid.mp4

这将产生类似于

的结果
Stream #0:0(eng): Video: h264 (High), yuv420p(progressive), 1912x1036 [SAR 1:1 DAR 478:259], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Stream #0:1(fre): Audio: ac3, 48000 Hz, 5.1(side), fltp, 448
Stream #0:2(eng): Subtitle: subrip