本文会介绍:通过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)