FFmpeg 参数详解(一)

来源:互联网 发布:百度关键字优化 编辑:程序博客网 时间:2024/05/17 08:02

1、ffmpeg语法结构:

ffmpeg [global_options] {[input_file_options] -i input_file} ... {[output_file_options] output_file} ...

2、描述

ffmpeg是一个非常快速的可以从直播的音视频源抓取输入作为视频和音频转换器。它也能在任意的采样率和高质量的多路过滤器的动态调整视频尺寸之间转换视频。

ffmpeg可以用 “-i”这个选项读取任意数量的输入文件(这些文件可以是正常文件、管道、网络流,抓取设备等),写入任意数量的被声明为一个简单的输出文件名的文件。在命令行的任何不能被解释的选项都被作为输出文件。

每个输入输出文件在原则上可以包含任何类型的流(视频/音频/字幕/附件/数据)。容器的格式限定了流的数量和类型。从哪一个输入选择的输入流将会自动的或者用 -map选项 进入哪个输出。

要引用输入文件的选项,必须要使用输入文件的索引(索引从0开始)。例如第一个输入文件的索引是0,第二个文件的索引为1,等等。同样的,在文件中的流也是用索引引用的。例如,2:3 引用的是第3个输入文件的第4个流。详见关于流说明的一章文档。

作为一个通用的规则,选项都应用在下一个声明的文件上。因此,顺序是十分重要的,因此在命令行上相同的选项可以出现很多次。每次出现都使用在下一个输入或输出文件上。全局选项是从这个规则扩展来的,全局选项必须被先声明。

不要搞混输入和输出文件,首先声明的是输入文件,然后才是所有的输出文件。也不要把属于不同文件的参数搞混。所有的参数仅仅适用于下一个输入或输出文件。并且不同文件直接是被重新设置的。

设置输出视频文件的码率是64kbps

ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
强制设置输出文件的帧率为24fps

ffmpeg -i input.avi -r 24 output.avi

强制输入文件的帧率为1fps(仅仅对原生格式有效)并且输出文件的帧率为24fps:

ffmpeg -r 1 -i input.m2v -r 24 output.avi

可能format只是原生的输入文件需要fomat这个选项。

3、过滤器

ffmpeg的处理转换流程如下所示:

ffmpeg调用libavformat库(包含了解封装)去读取输入文件从输入文件中得到编码的包。当有多个输入文件时,ffmpeg试着保持它们跟最低时间戳的轨迹同步。

编码的包然后被传递给解码器(除非流选择了流复制的形式,请看更详细的描述)。解码器解压能被过滤器进一步处理的帧(原生视频/PCM 音频/…)。经过过滤后,帧被传递给编码器,编码器进行编码并且输出到编码包。最后传递到合成器,合成器将编码后的包写入到输出文件。

3.1、过滤器

在编码以前,ffmpeg能够使用libavfilter库对原生视频帧进行过滤。多个过滤器是以链的形式出现在过滤器图上。ffmpeg分为两种类型的过滤图,简单的和复杂的。

3.1.1、简单过滤图

简单的过滤图必须是一个输入对应一个输出,并且输入和输出的类型必须相同。在上面ffmpeg的转换视图中可以在解码和编码之间插入表示过滤的一步。

如下图所示:


简单的过滤图对每个流用-filter配置(可以使用视频和音频的别名-vf 和 -af)。一个简单的过滤图的例子如下:

注意一些过滤器改变了帧的属性,但是没有改变帧的内容。例如在上面例子中的 fps 过滤器改变了帧的数量,但是没有触及到帧的内容。另外一个例子是 setpts 过滤器,同样没有改变真的内容仅仅设置了时间戳。

3.1.2、复杂过滤器

复杂的过滤图不能简单的描述为对一个流进行的线性处理链。可以这样理解复杂过滤图,例如,当有超过一个输入或输出时,或者输出和输入的类型不匹配。可以使用下面这幅图表示:


复杂过滤器使用-fileter_complex配置。注意这个参数是全局的,因此复杂过滤器不能被用来和某个单一的流或文件进行关联。-lavfi参数等同于-fileter_complex。

一个小的复杂过滤图的例子是overlay 过滤器,这个例子有2个视频输入和一个视频输出,一个视频覆盖了在另外一个视频的顶部,对应音频部分是 amix过滤器。


3.2、流复制

流复制是一种靠提供copy参数给-codec选项的模式。它使ffmpeg对声明的流删除了解码和编码的步骤,因此所做的工作仅仅是解封装和封装。流复制是用来改变容器的格式或者修改容器级别的元信息(meta)。解码的流程简单为如下步骤:


因为流复制没有解码和编码的过程,所以速度是很快的,并且是无损的。然而,在某些情况下因为一些因素可能不起作用。应用过滤器很显然是不可能的,应用过滤器是工作在解压缩的数据上。


4、流选择

默认情况下,ffmpeg仅仅对输入文件的每种类型(视频、音频、字幕)包含了一个流并且把它们加入到输出文件。ffmpeg选择最好的流根据以下条件:视频选择最高分辨率的流,音频选择最多频道的流,字幕选择第一个字幕流。如果有几个相同质量的流,将会选择最小索引的流。

你可以使用 -vn/-an/-sn选项禁用默认的配置。如果靠人工控制,使用-map参数也会禁用默认参数。


参考:https://ffmpeg.org/ffmpeg.html

0 0