本文会介绍:通过ffmpeg实现下列的功能
如何查看视频文件中各个流的序号:使用ffprobe
> ffprobe <input.mp4> &> info.txt
> vim info.txt
使用ffprobe查看input.mp4的信息,并保存在info.txt中。
xxxxxxxxxx
> ffmpeg -i input.mkv \
-vf scale=640:360,subtitles=input.mkv:si=25 \
-b:v 0.96M \
-c:v libx264 \
output.mp4
其中:
-i <input file>
:是源文件
-vf scale=<xx>:<yy>
: 调整分辨率为xx:yy
-vf subtitles=<input file>[:si=<subtitle_stream_index>]
:烧录字幕,字幕文件来自input file。 []
可选,设定使用其中的第几个字幕流(index排序不包括视频、音频流)。如果input file直接就是字幕文件(srt, ass etc.),就不用方括号内的东西了。
-b:v
: 设定视频码率
-c:v
:设定视频编码器。常用的都是H264,而libx264是最常见的视频编码器。
<output.mp4>最后是输出文件
如何使用多个参数:
如果
-vf
后面带多个选项,那么需要用,
分隔。不能把-vf
写多次,前面的会被后面的覆盖。
烧录中文字幕出现□□□□□字符
出现这种情况是因为ubuntu服务器中没有中文字体。从windows中拷贝宋体的字体文件(simsun.ttc)到/user/share/fonts/truetype/dejavu,注意权限跟其他字体文件一样即可(
chmod 644 simsun.ttc
)。
xxxxxxxxxx
> ffmpeg -i input.mkv -map 0:v:0 -map 0:a:0 -map 0:s:0 \
-c:v copy \
-c:a copy \
-c:s mov_text \
output.mp4
-map <file_index>:<stream_type>:<stream_index>
用来选择视频流、音频流、字幕流。
mkv文件中封装了很多流,音频流、字幕流往往会有很多个。而mp4文件中只要一个视频、一个音频、一个字幕就可以了。可以用-map
进行选择。
<file_index>
是文件序号,按照-i
输入的顺序排序,从0
开始。
<stream_type>
是流的类型。v
对应视频流(video),a
对应音频流(audio),s
对应字幕流(subtitles)。
<stream_index>
是流的序号,按照同类流中的顺序排序,从0开始。比如,使用ffprobe测到mkv中中文字幕的序号是27,但是前面有视频流(1个)和音频(2个),那么中文字幕的stream_index=24(=27-3)
。所以
-map 0:s:0
就是选择第一个文件(0
)中字幕流(s
)中的第一个(0
)。
-c:<stream_type>
用来设定编码方式。stream_type
如前面介绍的,v/a/s
对应视频流/音频流/字幕流。copy
保留了输入文件中的编码方式。mov_text
是以文字格式保存字幕,能够制作软字幕,可以播放器中选择是否打开字幕。但软字幕在一般的播放器中不支持打开(Edge,华为浏览器),Safari支持打开软字幕。
xxxxxxxxxx
> ffmpeg -i <input.mp4> -ss 00:00:00 -to 00:00:56 -c copy output.mp4
截取00:00:00到00:00:56的视频片段。
也可以用-t
参数替代-to
,此时后面跟片段持续时间。
一些进阶选项
-preset veryslow 设置编码质量,在速度和文件大小间平衡。速度越快,文件越大。
-profile:v high/main
-r 30 设置帧率
视频质量和属性对应,码率、分辨率、帧率如何设置,可以看建议的上传编码设置 - YouTube帮助 (google.com)