![在 ffmpeg 中强制输出带有外部字幕的视频时长](https://linux22.com/image/1518755/%E5%9C%A8%20ffmpeg%20%E4%B8%AD%E5%BC%BA%E5%88%B6%E8%BE%93%E5%87%BA%E5%B8%A6%E6%9C%89%E5%A4%96%E9%83%A8%E5%AD%97%E5%B9%95%E7%9A%84%E8%A7%86%E9%A2%91%E6%97%B6%E9%95%BF.png)
我正在从视频文件开头 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
这将提取与所需视频片段相对应的字幕,然后将其与视频混合。