ffmpeg学习笔记

本文会介绍:通过ffmpeg实现下列的功能

  1. 降低分辨率,降低码率,实现在低速宽带下流畅运行
  2. 格式转换,从mkv到mp4
  3. 烧录字幕

代码示例

例1:查看视频文件中视频、音频、字幕流的信息

如何查看视频文件中各个流的序号:使用ffprobe

使用ffprobe查看input.mp4的信息,并保存在info.txt中。

例2:降低视频质量(大小)并烧录字幕,从mkv转换成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 )。

例3:mkv转成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支持打开软字幕。

例4:截取视频片段

截取00:00:00到00:00:56的视频片段。

也可以用-t参数替代-to,此时后面跟片段持续时间。

进阶

一些进阶选项

-preset veryslow 设置编码质量,在速度和文件大小间平衡。速度越快,文件越大。

-profile:v high/main

-r 30 设置帧率

ffmpeg的教程

官网文档

FFmpeg 视频处理入门教程 - 阮一峰

参考数据

视频质量和属性对应,码率、分辨率、帧率如何设置,可以看建议的上传编码设置 - YouTube帮助 (google.com)