在 ffmpeg 中强制输出带有外部字幕的视频时长

在 ffmpeg 中强制输出带有外部字幕的视频时长

我正在从视频文件开头 30 分钟处提取 1 分钟长的片段,并使用以下命令从外部文件添加字幕:

ffmpeg -ss 1800 -i input_video.m4v -ss 1800 -i input_subtitle.srt -map 1:0 -c:a aac -c:v libx264 -c:s mov_text -crf 35 -preset slow -t 60 -avoid_negative_ts 1 output_video.mp4

我遇到的问题是转码后的视频的持续时间00:01:03.50与预期的不一致00:01:00.00。当使用 VLC 播放此类视频时,播放在进度条到达末尾之前停止。

仅当我删除字幕输入时,持续时间才会恰好变为 1 分钟。看起来输出文件的持续时间被延长以适合在定义的 1 分钟范围内开始的字幕的最后一句。

有没有办法强制输出持续时间与-d标志中设置的值完全一致?

答案1

由于 ffmpeg 解析字幕文件的方式,您有两种选择:

输出为 MP4,但可能跳过字幕

ffmpeg -i input_video.m4v -i input_subtitle.srt -ss 1800 -c:a aac -c:v libx264 -c:s mov_text -crf 35 -preset slow -t 60 output_video.mp4

这应该会生成一个 60 秒的文件,但它会跳过任何在 1800 年代之前开始但延伸到 1800 年代之后的字幕。

输出到 MKV

ffmpeg -i input_video.m4v -i input_subtitle.srt -ss 1800 -c:a aac -c:v libx264 -c:s ass -crf 35 -preset slow -t 60 output_video.mkv

这里任何在 1800 年代之前开始并延续到 1800 年代之后的字幕都会出现,并且具有相应的长度,即,如果字幕从 1795 年开始并在 1802 结束,那么它将在输出中持续 2 秒。

2 步法

ffmpeg -i subfile -ss 1800 -t 60 sub.ass

ffmpeg -ss 1800 -i video.mp4 -i sub.ass -c:s mov_text out.mp4

这将提取与所需视频片段相对应的字幕,然后将其与视频混合。

相关内容