音频视频编辑工具 FFmpeg 使用介绍

2019-01-18 0 By admin

FFmpeg 作为最流行的音频和视频处理工具,其命名来自MPEG视频编码标准,“FF”是“Fast Forward”英语单词的缩写。
以下介绍对此工具的使用帮助说明。
命令行下ffmpeg的使用方法如下(方括号表示可选项,花括号表示必选项目):
ffmpeg [global options] {[infile options]['-i' 'infile'] ...} {[outfile options] 'outfile' ...}
其中的参数选项由三部分组成:

  1. 可选的一组全局参数
  2. 一组或多组输入文件参数
  3. 一组或多组输出文件参数

其中,每组输入文件参数以‘-i’为结束标记;每组输出文件参数以输出文件名为结束标记。

概述

FFmpeg工具安装完成后,会有以下命令供我们使用。
1、libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库。
2、libavcodec:用于各种类型声音/图像编解码。
3、libavutil:包含一些公共的工具函数。
4、libswscale:用于视频场景比例缩放、色彩映射转换。
5、libpostproc:用于后期效果处理。
6、ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码。
7、ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移。
8、ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示。

零、过滤器 filter

在多媒体处理中,filter的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具。
如:视频翻转,旋转,缩放等。
语法:[input_link_label1][input_link_label2]… filter_name=parameters [output_link_label1][output_link_label2]…
过滤器图link label :是标记过滤器的输入或输出的名称。

0.1、视频过滤器 -vf

testsrc视频按顺时针方向旋转90度:
ffplay -f lavfi -i testsrc -vf transpose=1
如testsrc视频水平翻转(左右翻转):
ffplay -f lavfi -i testsrc -vf hflip

0.2、音频过滤器 -af

实现慢速播放,声音速度是原始速度的50%:
ffplay p629100.mp3 -af atempo=0.5

0.3、过滤器链(Filterchain)

基本语法:Filterchain = filter1,filter2,filter3,…(逗号分隔的一组filter)
顺时针旋转90度并水平翻转示例:
ffplay -f lavfi -i testsrc -vf transpose=1,hflip

0.4、过滤器图(Filtergraph)

基本语法:Filtergraph = filterchain1;filterchain2(分号分隔的一组filterchain)
用ffplay直接观看结果:
fplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w
F1: split过滤器创建两个输入文件的拷贝并标记为[a],[b]
F2: [a]作为pad过滤器的输入,pad过滤器产生2倍宽度并输出到[1].
F3: [b]作为hflip过滤器的输入,vflip过滤器水平翻转视频并输出到[2].
F4: 用overlay过滤器把 [2]覆盖到[1]的旁边.

0.5、选择媒体流

一些多媒体容器比如AVI,mkv,mp4等,可以包含不同种类的多个流,如何从容器中抽取各种流呢?
语法:-map file_number:stream_type[:stream_number]
这有一些特别流符号的说明:
1、-map 0 选择第一个文件的所有流
2、-map i:v 从文件序号i(index)中获取所有视频流, -map i:a 获取所有音频流,-map i:s 获取所有字幕流等等。
3、特殊参数-an,-vn,-sn分别排除所有的音频,视频,字幕流。
注意:文件序号和流序号从0开始计数。

一、查看ffmpeg命令支持的属性

通过以下命令,我们可以查看到我们安装的ffmpeg工具支持的功能属性。

-formats 列出支持的文件格式。
-codecs 列出支持的编解码器。
-decoders 列出支持的解码器。
-encoders 列出支持的编码器。
-protocols 列出支持的协议。
-bsfs 列出支持的比特流过滤器。
-filters 列出支持的滤镜。
-pix_fmts 列出支持的图像采样格式。
-sample_fmts 列出支持的声音采样格式。

二、输入参数设置

2.1、常用输入选项

-i filename 指定输入文件名。
-f fmt 强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。
-ss hh:mm:ss[.xxx] 设定输入文件的起始时间点,启动后将跳转到此时间点然后开始读取数据。

2.2、输入选项的高级配置

对于输入源,以下选项通常是自动识别的,但也可以强制设定。

-c codec 指定解码器,需使用能力集列表中的名称。
-acodec codec 指定声音的解码器,需使用能力集列表中的名称。
-vcodec codec 指定视频的解码器,需使用能力集列表中的名称。
-b:v bitrate 设定视频流的比特率,整数,单位bps。
-r fps 设定视频流的帧率,整数,单位fps。
-s WxH 设定视频的画面大小。也可以通过挂载画面缩放滤镜实现。
-pix_fmt format 设定视频流的图像格式(如RGB还是YUV)。
-ar sample rate 设定音频流的采样率,整数,单位Hz。
-ab bitrate 设定音频流的比特率,整数,单位bps。
-ac channels 设置音频流的声道数目。

三、输出参数设置

3.1、常用输出选项

-f fmt 强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。
-c codec 指定编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。
-acodec codec 指定声音的编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。
-vcodec codec 指定视频的编码器,需使用能力集列表中的名称(编解码器设定为”copy“表示不进行编解码)。
-r fps 设定视频编码器的帧率,整数,单位fps。
-pix_fmt format 设置视频编码器使用的图像格式(如RGB还是YUV)。
-ar sample rate 设定音频编码器的采样率,整数,单位Hz。
-b bitrate 设定音视频编码器输出的比特率,整数,单位bps。
-ab bitrate 设定音频编码器输出的比特率,整数,单位bps。
-ac channels 设置音频编码器的声道数目。
-an 忽略任何音频流。
-vn 忽略任何视频流。
-t hh:mm:ss[.xxx] 设定输出文件的时间长度。
-to hh:mm:ss[.xxx] 如果没有设定输出文件的时间长度的画可以设定终止时间点。

四、流标识

FFMPEG的某些选项可以对一个特定的媒体流起作用,这种情况下需要在选项后面增加一个流标识。流标识允许以下几种格式:

  1. 流序号。譬如“:1”表示第二个流。
  2. 流类型。譬如“:a“表示音频流,流类型可以和流序号合并使用,譬如“:a:1”表示第二个音频流。
  3. 节目。节目和流序号可以合并使用。
  4. 流标识。流标识是一个内部标识号。

假如要设定第二个音频流为copy,则需要指定-codec:a:1 copy。

4.1、音频选项

-aframes 等价于frames:a,输出选项,用于指定输出的音频帧数目。
-aq 等价于q:a,老版本为qscale:a,用于设定音频质量。
-atag 等价于tag:a,用于设定音频流的标签。
-af 等价于filter:a,用于设定一个声音的后处理过滤链,其参数为一个描述声音后处理链的字符串。

4.2、视频选项

-vframes:等价于frames:v 输出选项,用于指定输出的视频帧数目。
-aspect 设置宽高比,如4:3、16:9、1.3333、1.7777等。
-bits_per_raw_sample 设置每个像素点的比特数。
-vstats 产生video统计信息。
-vf:等价于filter:v 用于设定一个图像的后处理过滤链,其参数为一个描述图像后处理链的字符串。
-vtag:等价于tag:v 用于设定视频流的标签。
-force_fps 强制设定视频帧率。
-force_key_frames 显式控制关键帧的插入,参数为字符串,可以是一个时间戳,也可以是一个“expr:”前缀的表达式。如“-force_key_frames 0:05:00”、“-force_key_frames expr:gte(t,n_forced*5)”

五、补充

其他还包括路径、字幕等选项。后续会补充,敬请期待。
-re:要求按照既定速率处理输入数据,这个速率即是输入文件的帧率。
-map:指定输出文件的流映射关系。例如 “-map 1:0 -map 1:1”要求将第二个输入文件的第一个流和第二个流写入到输出文件。如果没有-map选项,ffmpeg采用缺省的映射关系。