需要截取一部电影里的一小段同时写入硬字幕。
查找了很多文献,最后得出
ffmpeg -ss [time] -to [time] -i [input] -vf subtitles=[ass] output.mp4
这条命令。
最后产生的结果是,电影确实按照预设的时间线裁剪出来了,字幕确实也烧录到里面了,但是字幕文件并没有按裁剪的时间线走,而是从头开始,找了很多资料也没有了解到关于字幕的相关裁剪时间命令。
无奈上来请教 0.0
1
jifengg 2020-08-24 10:23:51 +08:00 1
-ss 和-to 写在-i 前面的时候,是对“输入文件进行截取”之后再进行字幕叠加。要改成
-i [input] -ss [time] -to [time] ,-i 写在前面,这样的意思是“输出文件只截取 ss 到 to 秒”,这样字幕时间线就正常了。 注意,ffmpeg 有些参数的位置是有考究的。特别是 -i 前后。 |
2
zhouweiluan OP @jifengg 非常感谢解答!这样确实字幕时间线能够正常。
但是-i 在前导致的一个问题是他会先把整部电影先过一遍后再截取,导致整个编码时间非常久。 还有没有另外的方法可以直接编码我需要的部分但是又能够字幕时间线正常的呢。 |
3
jifengg 2020-08-27 12:54:12 +08:00 1
@zhouweiluan 暂时没找到好办法。一个方法是,先把字幕文件进行截取:
ffmpeg -sub_charenc gb2312 -i in.srt -ss ** -to ** -y out.srt 然后再用你一开始的语句“ffmpeg -ss [time] -to [time] -i [input] -vf subtitles=[ass] output.mp4”去加硬字幕。 这个方法有一个弊端,如果你的截取时间点正好落在一句话上,ffmpeg 会舍弃这句话。出来的 srt 会少头少尾。当然解决办法也有,你截取的时候往前几十秒截。转码的时候-i 前面是你原先的-ss,-i 后面再加一个-ss 是你字幕往前偏移的那几十秒。 |
4
zhouweiluan OP @jifengg 太感谢了,是个好办法。
|
5
yuetian 2021-05-27 09:57:44 +08:00 via Android 1
vf 烧录字幕时会把字幕文件和视频流时间轴零点对齐,可以先调字幕文件时间轴,然后烧录,比如下面这两行,只给第 2 分钟的视频烧录字幕,
$ ffmpeg -itsoffset -00:01:00 -i rawsub.ass -map 0 -c ass sub.ass $ ffmpeg -ss 00:01:00 -to 00:02:00 -i rawvideo.mp4 -map 0 -filter:v ass=f=sub.ass -c:v h264 -c:a copy video.mp4 |
6
zhouweiluan OP @yuetian 感谢大佬解答,回头我试一下~
|