求问关于 ffmpeg 烧录硬字幕的时间线问题。

2020-08-22 01:26:45 +08:00
 zhouweiluan

需要截取一部电影里的一小段同时写入硬字幕。
查找了很多文献,最后得出
ffmpeg -ss [time] -to [time] -i [input] -vf subtitles=[ass] output.mp4
这条命令。
最后产生的结果是,电影确实按照预设的时间线裁剪出来了,字幕确实也烧录到里面了,但是字幕文件并没有按裁剪的时间线走,而是从头开始,找了很多资料也没有了解到关于字幕的相关裁剪时间命令。
无奈上来请教 0.0

2552 次点击
所在节点    FFmpeg
6 条回复
jifengg
2020-08-24 10:23:51 +08:00
-ss 和-to 写在-i 前面的时候,是对“输入文件进行截取”之后再进行字幕叠加。要改成
-i [input] -ss [time] -to [time] ,-i 写在前面,这样的意思是“输出文件只截取 ss 到 to 秒”,这样字幕时间线就正常了。

注意,ffmpeg 有些参数的位置是有考究的。特别是 -i 前后。
zhouweiluan
2020-08-25 01:01:55 +08:00
@jifengg 非常感谢解答!这样确实字幕时间线能够正常。
但是-i 在前导致的一个问题是他会先把整部电影先过一遍后再截取,导致整个编码时间非常久。
还有没有另外的方法可以直接编码我需要的部分但是又能够字幕时间线正常的呢。
jifengg
2020-08-27 12:54:12 +08:00
@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 是你字幕往前偏移的那几十秒。
zhouweiluan
2020-08-27 16:54:35 +08:00
@jifengg 太感谢了,是个好办法。
yuetian
2021-05-27 09:57:44 +08:00
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
zhouweiluan
2021-05-28 12:30:34 +08:00
@yuetian 感谢大佬解答,回头我试一下~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/700409

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX