文章

ffmpeg 使用

ffmpeg 使用

官方文档

使用

.sup字幕文件叠加到视频中

1
2
ffmpeg.exe -i movie.mkv -i subtitle.sup -filter_complex "[1:s]setpts=PTS+4.754756/TB[sec],[0:v][sec]overlay[v]" -map "[v]" -map 0:a movie.2.mkv
ffmpeg.exe -i movie.mkv -i subtitle.sup -filter_complex "[1:s]trim=duration=10,setpts=PTS+4.754756/TB[sec],[0:v]trim=duration=10[main],[main][sec]overlay[v]" -map "[v]" movie.2.mkv

filter_complex 中的 filters 会按顺序执行, 例如上面的命令中, 先将字幕文件的前 10 秒截取出来, 时间戳加上 4.754756 秒, 然后再将视频文件的前 10 秒截取出来, 最后将两个截取的视频叠加. filtergraph 语法参考这里
[0:v] 表示第一个输入文件的视频流, [1:s] 表示第二个输入文件的字幕流, [v] 表示输出文件的视频流. stream specifers 参考这里
-map 表示输出文件的流, -map 0:a 表示输出文件的第一个音频流, -map "[v]" 表示输出文件的第一个视频流. 语法参考这里

查看视频信息

1
2
ffprobe -v error -select_streams s:0 -show_entries stream=start_time,time_base,duration -of default=noprint_wrappers=1 subtitle.sup
ffprobe -v error -select_streams s:0 -show_entries frame:packet -print_format json -read_intervals %+#10 subtitle.sup

-select_streams s:0 表示只输出第一个字幕流, -show_entries stream=start_time,time_base,duration 表示输出字幕流的开始时间, 时间基准和持续时间, -of default=noprint_wrappers=1 表示输出格式为 key=value 形式.
-show_entries frame:packet 表示输出帧信息和包信息, -print_format json 表示输出格式为 json, -read_intervals %+#10 表示只输出前 10 帧的信息. show_entries 的内容参考这里, 主要的 section name 有 format, stream, frame, packet, library_versions, pixel_format, program_version.

本文由作者按照 CC BY 4.0 进行授权