ffmpeg 虽然很强大,但有一个看起来很简单的需求它却做不到:用一行命令实现从视频中截取一段,同时将对应的字幕作为硬字幕嵌入视频。
其实也不是绝对做不到,这样理论上可以完成该任务:
ffmpeg -i video.mp4 -vf subtitles=subs.ass -ss 01:12:20 -to 01:12:32 output.mp4
这行命令做了什么呢?先把整个视频嵌入字幕后重编码,然后从中截取一段。也就是说,虽然你只需要输出 12 秒视频,但也必须等待 ffmpeg 完成整个文件的重编码。
熟悉 ffmpeg 的人可能都知道,-ss、-to 如果放在 -i 之前,表示先从原始视频中切割,然后对切割出来的那段进行重编码。而如果放在 -i 之后,则表示先对整个视频重编码,然后再切割。
那么为什么上面不把 -ss、-to 如果放在 -i 之前呢?因为 -ss、-to 仅对视频生效,不对字幕生效。如果把 -ss、-to 放在 -i 之前,切割出来视频的时间起点是 01:12:20,但嵌入的字幕还是从 00:00:00 开始。
所以,要高效地实现前述功能,可以先将字幕的时间轴减去 01:12:20:
ffmpeg -itsoffset -01:12:20 -i subs.ass -c copy subs_tmp.ass
ffmpeg -ss 01:12:20 -to 01:12:32 -i video.mp4 -vf subtitles=subs_tmp.ass output.mp4
发布于 北京
