FFmpeg文档

目录

1 概要

ffmpeg [ 全局选项] {[ 输入文件选项] -i 输入地址} ... {[ 输出文件选项] 输出地址} ...

2 描述

ffmpeg 是一个非常快速的视频和音频转换器,也可以从中抓取 一个现场音频/视频源。 它也可以在任意样本之间进行转换 利用高品质的多相滤波器实时调整视频并调整视频大小。

ffmpeg 从任意数量的输入"文件"中读取(可以是常规的 文件,管道,网络流,抓取设备等),由 -i 选项,并写入到任意数量的输出"文件",这是 由一个普通的输出url指定。 任何在命令行上发现的内容 不能被解释为一个选项被认为是一个输出url。

原则上,每个输入或输出网址都可以包含任意数量的流 不同类型(视频/音频/字幕/附件/数据)。 允许的数量和/或 流的类型可能受容器格式的限制。 选择哪个 输入将从哪个流进入哪个输出或者自动完成 或与 -map 选项(请参阅流选择章节)。

要引用选项中的输入文件,您必须使用它们的索引(从0开始)。 例如。 第一个输入文件是 0,第二个是 1等等。同样,流 在一个文件内被它们的索引引用。 例如 2:3 指的是 第四输入文件中的第四个流。 另请参阅流说明符一章。

作为一般规则,选项将应用于下一个指定的选项 文件。 因此,顺序很重要,你可以有相同的 在命令行上多次选择。 每次出现都是 然后应用于下一个输入或输出文件。 该规则的例外是全局选项(例如冗长级别), 这应该先指定。

不要混合输入和输出文件 - 首先指定所有输入文件,然后指定所有文件 输出文件。 也不要混合属于不同文件的选项。 所有 选项仅适用于下一个输入或输出文件,并在文件之间重置。

  • 要将输出文件的视频比特率设置为64 kbit / s:
    ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
    
  • 要强制输出文件的帧频为24 fps:
    ffmpeg -i input.avi -r 24 output.avi
    
  • 强制输入文件的帧速率(仅适用于原始格式)以1 fps和输出文件的帧频为24 fps:
    ffmpeg -r 1 -i input.m2v -r 24 output.avi
    

原始输入文件可能需要格式化选项。

3 详细描述

ffmpeg中每个输出的代码转换过程可以用下图来描述:

 _______              ______________
|       |            |              |
| 输入  |  分路       | 编码的数据分组|   解码
| 文件  |  --------->|              | -----+
|_______|            |______________|      |
                                           v
                                       _________
                                      |         |
                                      |  解码   |
                                      |  帧率   |
                                      |_________|
 ________             ______________       |
|        |           |              |      |
|  输出  | <-------- |编码的数据分组 | <----+
|  文件  |   复用器   |             |   编码
|________|           |______________|


ffmpeg调用libavformat库(包含demuxers)来读取输入文件并获取包含编码数据的数据包。 当有多个输入文件时, ffmpeg会尝试通过跟踪任何活动输入流上的最低时间戳来使它们保持同步。

然后将编码的数据包传递给解码器(除非为数据流选择了流拷贝,请参阅进一步的描述)。 解码器产生未压缩的帧(原始视频/ PCM音频/ ...),可以通过滤波进一步处理(参见下一节)。 在过滤之后,帧被传递给编码器,编码器对其进行编码并输出编码分组。 最后,这些被传递给复用器,它将编码的数据包写入输出文件。

3.1 过滤器

在编码之前, ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。 几个链式过滤器形成一个过滤器图形。 ffmpeg区分两种类型的过滤器图形:简单和复杂。

3.1.1 简单过滤器

简单的过滤器图就是那些只有一个输入和输出的过滤器图 相同的类型。 在上面的图中,他们可以通过简单插入来表示 解码和编码之间的附加步骤:

 _________                        ______________
|         |                      |              |
|  解码   |                      |  编码数据分组 |
|   帧    |\                   _ |              |
|_________| \                  /||______________|
             \   __________   /
  简单的     _\| |          | /  编码器
  过滤器图       | 过滤     |/
                | 帧       |
                |__________|

简单的过滤器图配置了per-stream-filter选项(分别为视频和音频使用-vf和-af别名)。 一个简单的视频滤镜可以看起来像这样:

 _______        _____________        _______        ________
|       |      |             |      |       |      |        |
| 输入  | ---> | 逐行扫描     | ---> | 比例  | ---> |  输出   |
|_______|      |_____________|      |_______|      |________|

请注意,某些滤镜会更改帧属性,但不会改变帧内容。 例如。 上例中的 fps过滤器会更改帧数,但不会触及帧内容。 另一个例子是 setpts过滤器,它只设置时间戳并以其他方式传递帧。

3.1.2 复杂过滤器

复杂的滤波器图是那些不能简单描述为线性的滤波器图 处理链应用于一个流。 例如,当图形存在时,就是这种情况 多于一个输入和/或输出,或者输出流类型不同于 输入。 它们可以用下图表示:

 _________
|         |
| 输入 0  |\                    __________
|_________| \                  |          |
             \   _________    /| 输出 0   |
              \ |         |  / |__________|
 _________     \| 复杂    | /
|         |     |         |/
| 输入 1  |---->| 过滤    |\
|_________|     |         | \   __________
               /| 图形    |  \ |          |
              / |         |   \| 输出 1   |
 _________   /  |_________|    |__________|
|         | /
| 输入 2  |/
|_________|

复杂的过滤器图使用 -filter_complex 选项进行配置。 请注意,这个选项是全球性的,因为一个复杂的过滤器图,就其性质而言, 不能明确地与单个流或文件相关联。

-lavfi 选项等同于 -filter_complex

一个复杂的filtergraph的简单例子是 overlay 过滤器 有两个视频输入和一个视频输出,其中一个视频覆盖在顶部 另一个。 它的音频对应是 amix 过滤器。

3.2 文件流复制

流式复制是通过向 copy 参数提供的模式选择的 -codec 选项。 它使得 ffmpeg 省略了解码和编码 步骤为指定的流,所以它只做demuxing和muxing。 它是有益的 用于更改容器格式或修改容器级元数据。该 在这种情况下,上图将简化为:

 _______              ______________            ________
|       |            |              |          |        |
| 输入  |  分路       |   编码数据    |  复用器  | 输出   |
| 文件  | ---------> |    分组       | -------> | 文件   |
|_______|            |______________|          |________|

由于没有解码或编码,因此速度非常快,而且没有质量 失利。 但是,由于许多因素,它在某些情况下可能不起作用。应用 过滤器显然也是不可能的,因为过滤器处理未压缩的数据。

4 文件流选择

默认情况下, ffmpeg 仅包含每种类型的一个流(视频,音频,字幕) 存在于输入文件中并将它们添加到每个输出文件。 它选择了 每一个都是基于以下标准的"最佳":对于视频而言,它是流 分辨率最高的是音频,它是具有最多频道的流 字幕,它是第一个字幕流。 在几个流的情况下 同样的类型率,选择索引最低的流。

您可以使用 -vn / -an / -sn / -dn 选项禁用其中一些默认值。 对于 完全手动控制,请使用 -map 选项,该选项仅禁用默认值 描述。

5 选项

所有的数字选项,如果没有另外指定,接受一个字符串 代表一个数字作为输入,其后可以跟随一个SI 单位前缀,例如:'K','M'或'G'。

如果将'i'附加到SI单位前缀,则完整的前缀将会是 解释为基于二进制倍数的单位前缀 1024的幂而不是1000的幂。将"B"附加到SI单元 前缀将该值乘以8.这允许使用,例如: 'KB','MiB','G'和'B'作为数字后缀。

不带参数的选项是布尔选项,并设置 对应的值为true。 可以通过前缀将它们设置为false 选项名称为"否"。 例如使用"-nofoo" 将名称为"foo"的布尔选项设置为false。

5.1 文件流说明符

每个流都应用一些选项,例如, 比特率或编解码器。 流说明符 用于精确指定给定选项属于哪个或哪些流。

流说明符通常是附加到选项名称和字符串的字符串 用冒号隔开。 例如。 -codec:a:1 ac3 包含 a:1 流说明符,它与第二个音频流匹配。 所以呢 会为第二个音频流选择ac3编解码器。

流说明符可以匹配多个流,以便该选项适用于所有流 其中。 例如。 -b:a 128k 中的流说明符匹配所有音频 流。

一个空的流说明符匹配所有的流。 例如, -codec copy -codec:copy 将复制所有流而不重新编码。

流说明符的可能形式是:

stream_index

与此索引匹配的流。 例如。 -threads:1 4 会设置 第二个流的线程数为4。

stream_type[: stream_index]

stream_type是以下之一:视频的'v'或'V',音频的'a',' 字幕,'d'表示数据,'t'表示附件。 'v'匹配所有视频 流,'V'只匹配没有附加图片,视频的视频流 缩略图或封面艺术。 如果给出了 stream_index ,那么它匹配 此类型的流号 stream_index 。 否则,它匹配所有 这种类型的流。

p: program_id[: stream_index] or p: program_id[: stream_type[: stream_index]] or

p: program_id:M: key[: value] 在第一个版本中,如果给定了 stream_index ,那么它会将流与编号 stream_index 在程序中使用id program_id 。 否则,它会匹配中的所有流 程序。 在第二个版本中, stream_type 是以下之一:'v'表示视频,'a'表示音频,'s' 为字幕,'d'为数据。 如果还给出了 stream_index ,那么它匹配 在具有id program_id 的程序中使用此类型的流编号 stream_index 。 否则,如果仅给出 stream_type ,则它匹配全部 程序中的这种类型的流具有id program_id 。 在第三个版本中,程序中的流与ID为 program_id 的元数据匹配 标签 具有指定的值。 如果 没有给出 value ,匹配包含给定标签的流 值。

# stream_id or i: stream_id

通过流ID匹配流(例如MPEG-TS容器中的PID)。

m: key[: value]

使用具有指定值的元数据标签 key 匹配流。 如果 没有给出 value ,匹配包含给定标签的流 值。

u

使用可用配置匹配流,编解码器必须被定义,并且 必须存在必要的信息,例如视频尺寸或音频采样率。

请注意,在 ffmpeg 中,通过元数据进行匹配只能正常工作 输入文件。

5.2 通用选项

这些选项由ff *工具共享。

-L

显示许可证。

-h, -?, -help, --help [ arg]

显示帮助。 可以指定一个可选参数来打印关于特定的帮助 项目。 如果没有指定参数,则只有基本(非高级)工具 显示选项。

arg 的可能值为:

long

除基本工具选项外,还打印高级工具选项。

full

打印选项的完整列表,包括共享和私人选项 用于编码器,解码器,解复用器,复用器,滤波器等。

decoder= decoder_name

打印有关名为 decoder_name 的解码器的详细信息。 使用 -decoders 选项可以获取所有解码器的列表。

encoder= encoder_name

打印有关名为 encoder_name 的编码器的详细信息。 使用 -encoders 选项可以获取所有编码器的列表。

demuxer= demuxer_name

打印有关名为 demuxer_name的分流器的详细信息。 使用 -formats 选项可以获得所有分路器和复用器的列表。

muxer= muxer_name

打印有关名为 muxer_name 的复用器的详细信息。 使用 -formats 选项可以获得所有muxers和demuxers的列表。

filter= filter_name

打印有关过滤器名称 filter_name 的详细信息。 使用 -filters 选项可以获取所有过滤器的列表。

-version

显示版本.

-formats

显示可用的格式(包括设备)。

-demuxers

显示可用的分路器

-muxers

显示可用的复用器

-devices

显示可用的设备。

-codecs

显示libavcodec已知的所有编解码器。

请注意,本文档中使用术语"codec"作为捷径 为什么更正确地称为媒体比特流格式。

-decoders

显示可用的解码器。

-encoders

显示所有可用的编码器。

-bsfs

显示可用的比特流筛选器。

-protocols

显示可用的协议。

-filters

显示可用的libavfilter过滤器。

-pix_fmts

显示可用的像素格式。

-sample_fmts

显示可用的样本格式。

-layouts

显示频道名称和标准频道布局。

-colors

显示公认的颜色名称。

-sources device[, opt1= val1[, opt2= val2]...]

显示输入设备的自动检测源。 某些设备可能会提供无法自动检测的与系统相关的源名称。 返回的列表不能被认为始终完整。

ffmpeg -sources pulse,server=192.168.0.4
-sinks device[, opt1= val1[, opt2= val2]...]

显示输出设备的自动检测接收器。 某些设备可能会提供无法自动检测的系统相关接收器名称。 返回的列表不能被认为始终完整。

ffmpeg -sinks pulse,server=192.168.0.4
-loglevel [ flags+] loglevel | -v [ flags+] loglevel

设置库使用的日志级别和标志。

可选的 标记前缀可以包含以下值:

repeat

表示重复的日志输出不应压缩到第一行 并且"Last message repeated n times"行将被省略。

level

指示日志输出应为每条消息添加一个 [level] 前缀 线。 这可以用作日志着色的替代,例如, 当倾销的时候 登录到文件。

通过添加'+'/' - '前缀来设置/重置单个标志,也可以单独使用标志 标志而不影响其他 标志或更改 loglevel 。 什么时候 设置 标志 loglevel ,预计会出现'+'分隔符 在最后一个 标记值和 loglevel 之间。

loglevel 是包含以下值之一的字符串或数字:

quiet, -8

什么都不显示; 安静。

panic, 0

只显示可能导致进程崩溃的致命错误,例如 断言失败。 这目前不用于任何事情。

fatal, 8

只显示致命错误。 这些过程完全是过程之后的错误 无法继续。

error, 16

显示所有错误,包括可以从中恢复的错误。

warning, 24

显示所有警告和错误。 任何与可能相关的消息 将显示不正确或意外的事件。

info, 32

在处理过程中显示信息性消息。 这是除了 警告和错误。 这是默认值。

verbose, 40

info 相同,除了更详细的内容。

debug, 48

显示一切,包括调试信息。

trace, 56

例如,要启用重复的日志输出,请添加 level 前缀并进行设置 loglevel verbose

ffmpeg -loglevel repeat+level+verbose -i input output

另一个例子可以在不影响电流的情况下重复输出日志 level 前缀标志或 loglevel 的状态:

ffmpeg [...] -loglevel +repeat

默认情况下程序会记录到stderr。 如果着色被支持 终端,颜色用于标记错误和警告。 日志着色 可以禁用设置环境变量 AV_LOG_FORCE_NOCOLOR NO_COLOR ,或者可以强制设置 环境变量 AV_LOG_FORCE_COLOR 。 不推荐使用环境变量 NO_COLOR 将会在未来的FFmpeg版本中下降。

-report

将完整的命令行和控制台输出转储到名为的文件中 当前的 程序 - YYYYMMDD - HHMMSS .log 目录。 此文件可用于错误报告。 它也意味着 -loglevel verbose

将环境变量 FFREPORT 设置为任何值都具有 同样的效果。 如果该值是':' - 分隔的key = value序列,则这些 选项会影响报告; 选项值必须被转义,如果他们 包含特殊字符或选项分隔符':'(请参阅 "引用和转义"部分在ffmpeg-utils手册中)。

以下选项被认可:

file

设置报告使用的文件名称; %p 扩展为名称 程序中, %t 被扩展为时间戳, %% 被展开 转换为普通的

level

使用数值设置日志详细级别(请参阅 -loglevel )。

例如,要将报告输出到名为 ffreport.log 的文件 使用 32 (日志级别 info 别名)的日志级别:

FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output

解析环境变量时的错误不是致命的,也不是 出现在报告中。

-hide_banner

禁止打印标题。

所有FFmpeg工具通常会显示版权声明,构建选项 和库版本。 该选项可用于抑制打印 此信息。

-cpuflags flags ( global)

允许设置和清除CPU标志。 这个选项是有意的 供测试用。 除非你知道你在做什么,否则不要使用它。

ffmpeg -cpuflags -sse+mmx ...
ffmpeg -cpuflags mmx ...
ffmpeg -cpuflags 0 ...

这个选项可能的标志是:

x86
mmx
mmxext
sse
sse2
sse2slow
sse3
sse3slow
ssse3
atom
sse4.1
sse4.2
avx
avx2
xop
fma3
fma4
3dnow
3dnowext
bmi1
bmi2
cmov
ARM
armv5te
armv6
armv6t2
vfp
vfpv3
neon
setend
AArch64
armv8
vfp
neon
PowerPC
altivec
Specific Processors
pentium2
pentium3
pentium4
k6
k62
athlon
athlonxp
k8

5.3 AV选项

这些选项直接由libavformat,libavdevice和 libavcodec库。 要查看可用AVOptions的列表,请使用 -help 选项。 它们分为两类:

generic

这些选项可以为任何容器,编解码器或设备设置。 通用选项 在容器/设备的AVFormatContext选项下列出 编解码器的AVCodecContext选项。

private

这些选项特定于给定的容器,设备或编解码器。 私人的 选项列在相应的容器/设备/编解码器下。

例如编写一个ID3v2.3头文件而不是默认的ID3v2.4来 一个MP3文件,使用MP3的 id3v2_version 私人选项 复用器:

ffmpeg -i input.flac -id3v2_version 3 out.mp3

所有的编解码器AVOptions是每个流,因此是一个流说明符 应该附在他们身上。

注意: -nooption 语法不能用于布尔值 AVOptions,使用 -option 0 / -option 1

注意:通过指定每个流AVOptions的旧未公开方式 将v / a / s预先添加到选项名称现在已过时并且将会 即将拆除。

5.4 主要选项

-f fmt ( input/output)

强制输入或输出文件格式。 格式通常是自动检测输入 文件,并从输出文件的文件扩展名中猜出,所以这个选项不是 在大多数情况下需要。

-i url ( input)

输入文件的地址

-y ( global)

覆盖输出文件而不询问。

-n ( global)

不要覆盖输出文件,并在指定的时候立即退出 输出文件已经存在。

-stream_loop number ( input)

设置输入流应循环的次数。 循环0意味着没有循环, 循环-1意味着无限循环。

-c[: stream_specifier] codec ( input/output,per-stream)
-codec[: stream_specifier] codec ( input/output,per-stream)

选择一个编码器(在输出文件之前使用)或解码器(使用时) 在输入文件之前)针对一个或多个流。 codec 是一个名字 解码器/编码器或特殊值 copy (仅输出)来指示 该流不被重新编码。

例如

ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT

使用libx264编码所有视频流并复制所有音频流。

对于每个流,都会应用最后匹配的 c 选项

ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT

将复制除了第二个视频之外的所有流,这些视频将被编码 libx264和第138个音频,它们将用libvorbis编码。

-t duration ( input/output)

当用作输入选项时(在 -i 之前),限制 持续时间 从输入文件读取数据。

当用作输出选项时(在输出url之前),停止写入 在持续时间达到 duration 后输出。

duration 必须是持续时间规范, 请参阅ffmpeg-utils(1)手册中的 (ffmpeg-utils)持续时间部分

-to和-t是互斥的,-t优先。

-to position ( input/output)

停止写入输出或读取 position 处的输入。 position 必须是持续时间规范, 请参阅ffmpeg-utils(1)手册中的 (ffmpeg-utils)Time duration部分

-to和-t是互斥的,-t优先。

-fs limit_size ( output)

设置文件大小限制,以字节表示。 没有更多的字节被写入 超过限制后。 输出文件的大小稍微大于 请求的文件大小。

-ss position ( input/output)

当用作输入选项时(在 -i 之前),将在此输入文件中寻找 位置。 请注意,在大多数格式中,不可能精确地查找, 所以 ffmpeg 会在 position 之前寻找最近的搜索点。 当转码和 -accurate_seek 被启用时(默认),这个 搜索点和 位置之间的额外片段将被解码 丢弃。 在进行流式复制或使用 -noaccurate_seek 时, 将被保留。

当用作输出选项时(在输出url之前),解码但丢弃 输入直到时间戳到达 position

position 必须是持续时间规范, 请参阅ffmpeg-utils(1)手册中的 (ffmpeg-utils)Time duration部分

-sseof position ( input/output)

-ss 选项一样,但相对于"文件结尾"。 这是消极的 值在文件中较早,0在EOF处。

-itsoffset offset ( input)

设置输入时间偏移。

offset 必须是一个持续时间规范, 请参阅ffmpeg-utils(1)手册中的 (ffmpeg-utils)Time duration部分

偏移量被添加到输入文件的时间戳中。指定 正偏移意味着相应的流被延迟了 在 offset 中指定的持续时间。

-timestamp date ( output)

在容器中设置录制时间戳。

date 必须是日期规范, 请参阅ffmpeg-utils(1)手册中的 (ffmpeg-utils)日期部分

-metadata[:metadata_specifier] key= value ( output,per-metadata)

设置元数据键/值对。

可以给出一个可选的 metadata_specifier 来设置元数据 在流,章节或程序上。 请参阅 -map_metadata 文档的详细信息。

此选项覆盖使用 -map_metadata 设置的元数据。 它是 也可以通过使用空值来删除元数据。

例如,在输出文件中设置标题:

ffmpeg -i in.avi -metadata title="my title" out.flv

要设置第一个音频流的语言:

ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
-disposition[:stream_specifier] value ( output,per-stream)

设置流的配置。

此选项覆盖从输入流复制的配置。 也是 可以通过将其设置为0来删除处置。

以下处置得到承认:

default
dub
original
comment
lyrics
karaoke
forced
hearing_impaired
visual_impaired
clean_effects
captions
descriptions
metadata

例如,要将第二个音频流设置为默认流:

ffmpeg -i in.mkv -disposition:a:1 default out.mkv

使第二个字幕流成为默认流并删除默认值 从第一个字幕流处置:

ffmpeg -i INPUT -disposition:s:0 0 -disposition:s:1 default OUTPUT
-program [title= title:][program_num= program_num:]st= stream[:st= stream...] ( output)

用指定的 标题 program_num 创建一个程序并添加指定的 stream (s)。

-target type ( output)

指定目标文件类型( vcd svcd dvd dv ), <代码> DV50)。 type 可以前缀为 pal - ntsc - film - 使用相应的标准。 所有格式选项 (比特率,编解码器,缓冲区大小)会自动设置。 你可以输入:

ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg

尽管如此,只要您知道,您可以指定其他选项 他们不与标准冲突,如:

ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
-dn ( output)

禁用数据记录。 有关完整的手动控制,请参阅 -map 选项。

-dframes number ( output)

设置要输出的数据帧的数量。 这是一个过时的别名 -frames:d ,你应该用它来代替。

-frames[: stream_specifier] framecount ( output,per-stream)

停止在 framecount 帧之后写入流。

-q[: stream_specifier] q ( output,per-stream)
-qscale[: stream_specifier] q ( output,per-stream)

使用固定质量等级(VBR)。 q / qscale 的含义是 编解码器依赖。 如果 qscale 没有使用 stream_specifier ,那么它仅适用于 到视频流,这是为了保持与以前的行为的兼容性 并为2个不同的编解码器指定相同的编解码器特定值 音频和视频通常不是当没有stream_specifier时的意图 用过的。

-filter[: stream_specifier] filtergraph ( output,per-stream)

创建由 filtergraph 指定的filtergraph并将其用于 过滤流。

filtergraph 是要应用于的filtergraph的描述 流,并且必须具有单个输入和单个输出 相同类型的流。 在filtergraph中,输入是关联的 到中的标签,并将输出发送到标签 out 。 看到 有关filtergraph的更多信息,请参阅ffmpeg-filters手册 句法。

如果你想看 -filter_complex选项 想要创建具有多个输入和/或输出的过滤器图。

-filter_script[: stream_specifier] filename ( output,per-stream)

这个选项类似于 -filter ,唯一的区别是它的 参数是过滤器图形描述文件的名称 读。

-filter_threads nb_threads ( global)

定义用于处理过滤器管道的线程数。 每个管道 将产生一个线程池,其中有许多线程可用于并行处理。 缺省值是可用CPU的数量。

-pre[: stream_specifier] preset_name ( output,per-stream)

为匹配的流指定预设。

-stats ( global)

打印编码进度/统计。 默认情况下,它是明确的 禁用它,你需要指定 -nostats

-progress url ( global)

将程序友好的进度信息发送到 url

进度信息大概每秒写一次,并在结尾 编码过程。 它由" key = value "行构成。 只包含字母数字字符。 序列的最后一个键 进度信息总是"进步"。

-stdin

在标准输入上启用交互。 默认情况下,除非标准输入是 用作输入。 要明确禁用交互,您需要指定 -nostdin

例如,如果禁用标准输入交互很有用 ffmpeg位于后台进程组中。 大致相同的结果可以 用 ffmpeg ... < /dev/null 来实现,但它需要一个壳。

-debug_ts ( global)

打印时间戳信息。 它默认关闭。 这个选项是 主要用于测试和调试目的以及输出 格式可能会从一个版本更改为另一个版本,所以它不应该是 由便携式脚本使用。

另见选项 -fdebug ts

-attach filename ( output)

将附件添加到输出文件。 这由几种格式支持 像Matroska对于例如 字幕中使用的字体。附件 被实现为特定类型的流,所以这个选项将被添加 一个新的文件流。 然后可以使用每个流选项 在通常的方式在这个流。 使用此创建的附件流 选项将在所有其他流(即创建的)之后创建 使用 -map 或自动映射)。

请注意,对于Matroska,您还必须设置mimetype元数据标记:

ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv

(假设附件流将在输出文件中排在第三位)。

-dump_attachment[: stream_specifier] filename ( input,per-stream)

将匹配附件流提取到名为 filename 的文件中。 如果 filename 为空,则为 filename 元数据标记的值 将会被使用。

例如。 将第一个附件提取到名为"out.ttf"的文件中:

ffmpeg -dump_attachment:t:0 out.ttf -i INPUT

将所有附件提取到由 filename 标记确定的文件中:

ffmpeg -dump_attachment:t "" -i INPUT

技术说明 - 附件实现为编解码器extradata,所以这个 选项实际上可以用来从任何流中提取额外数据,而不仅仅是 附件。

-noautorotate

根据文件元数据禁用自动旋转视频。

5.5 视频选项

-vframes number ( output)

设置要输出的视频帧数。这是 -frames:v 的一个过时的别名,您应该使用它。

-r[: stream_specifier] fps ( input/output,per-stream)

设置帧率(Hz值,分数或缩写)。

作为输入选项,忽略存储在文件中的任何时间戳,而是生成时间戳,假设帧速率为 fps 。这与用于某些输入格式(如image2或v4l2)的 -framerate 选项不同(它在FFmpeg的旧版本中与之相同)。如果有疑问,请使用 -framerate 而不是输入选项 -r

作为输出选项,复制或删除输入帧以实现恒定输出帧频 fps

-s[: stream_specifier] size ( input/output,per-stream)

设置框架大小。

作为输入选项,这是 video_size 专用选项的快捷方式,由某些分帧器识别,其帧大小未存储在文件中或可配置。 原始视频或视频采集卡。

作为输出选项,它会将 scale 视频过滤器插入到相应过滤器图的 end 中。 请直接使用 缩放过滤器将其插入开头或其他位置。

格式为' wxh '(默认 - 与源相同)。

-aspect[: stream_specifier] aspect ( output,per-stream)

设置由 aspect 指定的视频显示宽高比。

aspect 可以是浮点数字符串,也可以是 num den 格式的字符串,其中 num den 是宽高比的分子和分母。 例如"4:3","16:9","1.3333"和"1.7777"是有效的参数值。

如果与 -vcodec copy 一起使用,它将影响存储在容器级别的宽高比,但不会影响存储在编码帧中的宽高比(如果存在)。

-vn ( output)

禁用视频录制。 有关完整的手动控制,请参阅 -map 选项。

-vcodec codec ( output)

设置视频编解码器。 这是 -codec:v 的别名。

-pass[: stream_specifier] n ( output,per-stream)

选择通行证号码(1或2)。 它被用来做两路视频编码。 视频的统计信息在第一遍记录到日志文件中(另请参阅-passlogfile选项),并在第二遍中使用日志文件以确切的请求比特率生成视频。 在通过1时,您可以停用音频并将输出设置为空,例如Windows和Unix:

ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL
ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null
-passlogfile[: stream_specifier] prefix ( output,per-stream)

将两遍日志文件名前缀设置为 prefix ,默认文件名前缀为"ffmpeg2pass"。 完整的文件名将是 PREFIX-N.log ,其中N是特定于输出流的数字

-vf filtergraph ( output)

创建由 filtergraph 指定的filtergraph并使用它过滤流。

这是 -filter:v 的别名,请参阅 -filter选项

5.6 高级视频选项

-pix_fmt[: stream_specifier] format ( input/output,per-stream)

设置像素格式。 使用 -pix_fmts 显示所有支持的像素格式。 如果选择的像素格式不能被选择,ffmpeg会打印警告并选择编码器支持的最佳像素格式。 如果 pix_fmt 前缀为 + ,则如果无法选择所请求的像素格式,则ffmpeg将退出,并显示错误,并禁用filtergraph中的自动转换。 如果 pix_fmt 是单个 + ,则ffmpeg会选择与输入(或图形输出)相同的像素格式,并禁用自动转换。

-sws_flags flags ( input/output)

设置SwScaler标志。

-vdt n

放弃阈值。

-rc_override[: stream_specifier] override ( output,per-stream)

速率控制覆盖特定时间间隔,格式为"int,int,int"列表,并用斜杠分隔。 两个第一个值是开始和结束帧数,最后一个是量化器在正面使用,或者如果是负面,则使用质量因子。

-ilme

编码器强制隔行扫描支持(仅适用于MPEG-2和MPEG-4)。 如果您的输入文件是交错的,并且您希望保持隔行格式以减少损失,请使用此选项。 另一种方法是将输入流与 -deinterlace 反交错,但反交错引入了损失。

-psnr

计算压缩帧的PSNR。

-vstats

将视频编码统计信息转储到 vstats_HHMMSS.log

-vstats_file file

将视频编码统计信息转储到 文件

-vstats_version file

指定要使用哪个版本的vstats格式。缺省值是2。

version = 1 :

frame= %5d q= %2.1f PSNR= %6.2f f_size= %6d s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s

version > 1:

out= %2d st= %2d frame= %5d q= %2.1f PSNR= %6.2f f_size= %6d s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s

-top[: stream_specifier] n ( output,per-stream)

top=1/bottom=0/auto=-1 field first

-dc precision

Intra_dc_precision.

-vtag fourcc/tag ( output)

强制视频标签/ fourcc。这是别名 -tag:v.

-qphist ( global)

Show QP histogram

-vbsf bitstream_filter

Deprecated see -bsf

-force_key_frames[: stream_specifier] time[, time...] ( output,per-stream)
-force_key_frames[: stream_specifier] expr: expr ( output,per-stream)

在指定的时间戳强制关键帧,更确切地说在每个指定时间之后的第一帧。

如果参数前缀为 expr:,则字符串 expr 会像表达式一样解释并针对每个帧进行评估。 如果评估不为零,则强制关键帧。

如果其中一个时间为" chapters [ delta ]",则它将扩展到文件中所有章节开始的时间,并由 delta < / var>,表示为以秒为单位的时间。 此选项可用于确保在章节标记或输出文件中的任何其他指定位置存在查找点。

例如,要在5分钟时插入关键帧,在每章开始前0.1秒加上关键帧:

-force_key_frames 0:05:00,chapters-0.1

expr 中的表达式可以包含以下常量:

n

当前处理帧的数量,从0开始

n_forced

强制帧的数量

prev_forced_n

前一个强制帧的编号,当没有关键帧被强制时,它是 NAN

prev_forced_t

前一个强制帧的时间,当没有关键帧被强制时,它是 NAN

t

当前处理帧的时间

例如,要每5秒强制一次关键帧,可以指定:

-force_key_frames expr:gte(t,n_forced*5)

在最后一个强制时间的5秒后强制关键帧,从第二个13开始:

-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))

请注意,强制过多的关键帧对于某些编码器的前瞻性算法非常有害:使用固定GOP选项或类似方法会更有效。

-copyinkf[: stream_specifier] ( output,per-stream)

在进行流式复制时,还要复制在开始处找到的非关键帧。

-init_hw_device type[= name][: device[, key=value...]]

使用给定的设备参数初始化名为 name 的新类型为 type 的硬件设备。 如果没有指定名称,它将收到" type %d"形式的默认名称。

device 的含义和以下参数取决于设备类型:

cuda

device 是CUDA设备的编号。

dxva2

device 是Direct3D 9显示适配器的编号。

vaapi

device 是X11显示名称或DRM渲染节点。 如果未指定,它将尝试打开默认的X11显示器( $ DISPLAY ),然后尝试打开第一个DRM渲染节点( / dev / dri / renderD128 )。

vdpau

device 是一个X11显示名称。 如果未指定,它将尝试打开默认的X11显示( $ DISPLAY )。

qsv

device 在' MFX_IMPL _ * '中选择一个值。允许的值是:

auto
sw
hw
auto_any
hw_any
hw2
hw3
hw4

如果未指定,则使用' auto_any '。 (请注意,通过创建平台适当的子设备(' dxva2 '或' vaapi '),然后派生一个QSV设备,可能更容易达到QSV的预期结果 从那。)

opencl

device 选择平台和设备为 platform_index.device_index

也可以使用键值对来过滤设备组,以仅查找与特定平台或设备字符串匹配的设备。

可用作过滤器的字符串是:

platform_profile
platform_version
platform_name
platform_vendor
platform_extensions
device_name
device_vendor
driver_version
device_version
device_profile
device_extensions
device_type

索引和过滤器必须一起唯一地选择一个设备。

例子:

-init_hw_device opencl:0.1

选择第一个平台上的第二个设备。

-init_hw_device opencl:,device_name=Foo9000

选择包含字符串 Foo9000 的设备。

-init_hw_device opencl:1,device_type=gpu,device_extensions=cl_khr_fp16

在支持 cl_khr_fp16 扩展名的第二个平台上选择GPU设备。

-init_hw_device type[= name]@ source

初始化名为 name 的新类型为 type 的硬件设备,并从名为 source 的现有设备中派生它。

-init_hw_device list

列出此构建的ffmpeg支持的所有硬件设备类型。

-filter_hw_device name

将名为 name 的硬件设备传递到任何过滤器图形中的所有过滤器。 通过 hwupload 过滤器或使用 hwmap 过滤器映射到的设备,可以使用此设置将设备上载到该设备。 其他滤波器在需要硬件设备时也可以使用此参数。 请注意,这通常仅在输入不在硬件帧中时才需要 - 过滤器将在它们接收到的帧的上下文中作为输入获取所需的设备。

这是一个全局设置,因此所有过滤器都会收到相同的设备。

-hwaccel[: stream_specifier] hwaccel ( input,per-stream)

使用硬件加速来解码匹配的流。 hwaccel 允许的值为:

none

不要使用任何硬件加速(默认)。

auto

自动选择硬件加速方法。

vdpau

使用VDPAU(视频解码和演示API for Unix)硬件加速。

dxva2

使用DXVA2(DirectX视频加速)硬件加速。

vaapi

使用VAAPI(视频加速API)硬件加速。

qsv

使用英特尔QuickSync视频加速进行视频转码。

与大多数其他值不同,此选项不启用加速解码(无论何时选择qsv解码器时都会自动使用),而是加速转码,而不会将帧复制到系统内存中。

为了使其工作,解码器和编码器都必须支持QSV加速,并且不必使用滤波器。

如果选定的hwaccel不可用或不被选定的解码器支持,则此选项不起作用。

请注意,大多数加速方法都用于播放,并且速度不会比现代CPU上的软件解码速度快。 此外, ffmpeg 通常需要将已解码的帧从GPU内存复制到系统内存中,导致性能进一步下降。 因此这个选项主要用于测试。

-hwaccel_device[: stream_specifier] hwaccel_device ( input,per-stream)

选择一个用于硬件加速的设备。

只有同时指定了 -hwaccel 选项时,该选项才有意义。 它可以引用通过名称使用 -init_hw_device 创建的现有设备,也可以创建新设备,就像' -init_hw_device ' type hwaccel_device 被立即调用。

-hwaccels

列出此构建的ffmpeg支持的所有硬件加速方法。

5.7 音频选项

-aframes number ( output)

设置要输出的音频帧的数量。 这是 -frames:a 的过时别名,您应该使用它。

-ar[: stream_specifier] freq ( input/output,per-stream)

设置音频采样频率。 对于输出流,它默认设置为相应输入流的频率。 对于输入流,此选项仅适用于音频抓取设备和原始分路器,并且映射到相应的分路器选件。

-aq q ( output)

设置音频质量(编解码器专用,VBR)。这是-q:a的别名。

-ac[: stream_specifier] channels ( input/output,per-stream)

设置音频通道的数量。 对于输出流,它默认设置为输入音频通道的数量。 对于输入流,此选项仅适用于音频抓取设备和原始分路器,并且映射到相应的分路器选件。

-an ( output)

禁用录音。有关完整的手动控制,请参阅 -map 选项。

-acodec codec ( input/output)

设置音频编解码器。这是 -codec:a 的别名。

-sample_fmt[: stream_specifier] sample_fmt ( output,per-stream)

设置音频采样格式。使用 -sample_fmts 获取支持的样本格式列表。

-af filtergraph ( output)

创建由 filtergraph 指定的filtergraph并使用它过滤流。

这是 -filter:a 的别名,请参阅 -filter选项

5.8 高级音频选项

-atag fourcc/tag ( output)

强制音频标签/ fourcc。这是 -tag:a 的别名。

-absf bitstream_filter

已弃用,请参阅-bsf

-guess_layout_max channels ( input,per-stream)

如果某些输入通道布局未知,请尝试仅在最多对应于指定数量的通道时进行猜测。 例如,2告诉 ffmpeg 识别1个声道为单声道,2个声道为立体声,而不是6个声道为5.1。 默认是总是尝试猜测。 使用0来禁用所有猜测。

5.9 字幕选项

-scodec codec ( input/output)

设置字幕编解码器。这是 -codec:s 的别名。

-sn ( output)

禁用字幕录制。有关完整的手动控制,请参阅 -map 选项。

-sbsf bitstream_filter

已弃用,请参阅-bsf

5.10 高级字幕选项

-fix_sub_duration

修复字幕的持续时间。 对于每个字幕,请等待同一个流中的下一个数据包,并调整第一个数据包的长度以避免重叠。 这对于一些字幕编解码器,尤其是DVB字幕是必要的,因为原始分组中的持续时间仅仅是粗略的估计,并且结尾实际上由空白的字幕框标记。 在必要时未能使用此选项可能会导致夸张的持续时间或由于非单调时间戳而导致的混合失败。

请注意,此选项会延迟所有数据的输出,直到下一个字幕包被解码为止:这可能会增加内存消耗和延迟。

-canvas_size size

设置用于渲染字幕的画布大小。

5.11 高级选项

-map [-] input_file_id[: stream_specifier][?][, sync_file_id[: stream_specifier]] | [linklabel] ( output)

指定一个或多个输入流作为输出文件的来源。 每个输入流由输入文件索引 input_file_id 和输入流文件中的输入流索引 input_stream_id 标识。 两个索引都从0开始。如果指定,则指定将哪个输入流用作演示同步参考。 sync_file_id stream_specifier

命令行上的第一个 -map 选项指定输出流0的源,第二个 -map 选项指定输出流1的源等。

流标识符之前的 - 字符创建"否定"映射。 它禁用已经创建的映射中的匹配流。

流索引之后的尾部 将允许地图为可选:如果地图不匹配任何流,则地图将被忽略而不是失败。 请注意,如果使用无效的输入文件索引,地图仍然会失败; 例如,如果地图引用了不存在的输入。

另一个 [linklabel] 表单将把来自复杂过滤器图形的输出(参见 -filter_complex 选项)映射到输出文件。 linklabel 必须对应于图中定义的输出链接标签。

例如,将来自第一个输入文件的所有流映射到输出

ffmpeg -i INPUT -map 0 output

例如,如果您在第一个输入文件中有两个音频流,则这些流由"0:0"和"0:1"标识。 您可以使用 -map 来选择要放置在输出文件中的流。 例如:

ffmpeg -i INPUT -map 0:1 out.wav

将输入流映射到由 <0:1>标识的 INPUT out.wav 中的(单个)输出流。

例如,要从输入文件 a.mov (由标识符"0:2"指定)中选择索引为2的流,并从输入 b.mov < samp>(由标识符"1:6"指定),并将它们复制到输出文件 out.mov 中:

ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov

从输入文件中选择所有视频和第三个音频流:

ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT

要映射除第二个音频以外的所有流,请使用负映射

ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT

要从第一个输入映射视频和音频流,并使用结尾的 ,如果第一个输入中不存在音频流,请忽略音频映射:

ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT

要选择英文音频流:

ffmpeg -i INPUT -map 0:m:language:eng OUTPUT

请注意,使用此选项会禁用此输出文件的默认映射。

-ignore_unknown

如果试图复制这样的流,忽略具有未知类型的输入流而不是失败。

-copy_unknown

如果试图复制这样的流,允许复制具有未知类型的输入流而不是失败。

-map_channel [ input_file_id. stream_specifier. channel_id|-1][?][: output_file_id. stream_specifier]

将给定输入的音频通道映射到输出。 如果未设置 output_file_id stream_specifier ,则音频通道将映射到所有音频流。

使用"-1"而不是 input_file_id stream_specifier channel_id 将映射静音通道。

尾部的 将允许map_channel是可选的:如果map_channel不匹配频道,map_channel将被忽略而不是失败。

例如,假设 INPUT 是立体声音频文件,您可以使用以下命令切换两个音频声道:

ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT

如果您想要静音第一个频道并保留第二个频道:

ffmpeg -i INPUT -map_channel -1 -map_channel 0.0.1 OUTPUT

"-map_channel"选项的顺序指定输出流中通道的顺序。 输出通道布局是从映射的通道数量中猜出的(如果是一个"-map_channel",则为单声道,如果是两个,则为立体声等)。 如果输入和输出通道布局不匹配(例如两个"-map_channel"选项和"-ac 6"),使用"-ac"结合"-map_channel"会使通道增益级别更新。

您还可以将输入的每个通道提取到特定输出; 以下命令将 INPUT 音频流(文件0,流0)的两个通道提取到相应的 OUTPUT_CH0 OUTPUT_CH1 输出:

ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1

以下示例将立体声输入的声道分成两个单独的流,它们放在同一个输出文件中:

ffmpeg -i stereo.wav -map 0:0 -map 0:0 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg

请注意,目前每个输出流只能包含来自单个输入流的通道; 例如,您不能使用"-map_channel"来选择包含在不同流(来自相同或不同文件)中的多个输入音频通道,并将它们合并到单个输出流中。 因此,例如,现在不可能将两个单独的单声道流变成单个立体声流。 然而,将立体声流分成两个单声道单声道流是可能的。

如果您需要此功能,可能的解决方法是使用 amerge 过滤器。 例如,如果您需要将具有2个单声道音频流的媒体(此处 input.mkv )合并为一个立体声声道音频流(并保留视频流),则可以使用以下命令:

ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv

要从第一个输入映射前两个音频通道,并使用尾部的 ,如果第一个输入是单声道而不是立体声,则忽略音频通道映射:

ffmpeg -i INPUT -map_channel 0.0.0 -map_channel 0.0.1? OUTPUT
-map_metadata[: metadata_spec_out] infile[: metadata_spec_in] ( output,per-metadata)

infile 设置下一个输出文件的元数据信息。 请注意,这些是文件索引(从零开始),而不是文件名。 可选的 metadata_spec_in / out 参数指定要复制的元数据。 元数据说明符可以具有以下形式:

g

全局元数据,即适用于整个文件的元数据

s[: stream_spec]

每个流元数据。 stream_spec 是一个流说明符,如 流说明符一章中所述。 在输入元数据说明符中,第一个匹配流将从中复制。 在输出元数据说明符中,所有匹配的流都被复制到。

c: chapter_index

每章元数据。 chapter_index 是从零开始的章节索引。

p: program_index

每个节目的元数据。 program_index 是从零开始的程序索引。

如果省略了元数据说明符,则默认为全局。

默认情况下,从第一个输入文件复制全局元数据,每个流和每个章节元数据与流/章一起复制。 这些默认映射通过创建相关类型的映射来禁用。 否定文件索引可用于创建仅禁用自动复制的虚拟映射。

例如,要将输入文件的第一个流中的元数据复制到输出文件的全局元数据:

ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3

相反,即将全局元数据复制到所有音频流:

ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv

注意简单的 0 在这个例子中也可以工作,因为全局元数据是默认的。

-map_chapters input_file_index ( output)

将索引 input_file_index 的输入文件中的章节复制到下一个输出文件。 如果未指定章节映射,则从第一个输入文件中至少复制一章。 使用否定文件索引禁用任何章节复制。

-benchmark ( global)

在编码结尾处显示基准测试信息。 显示使用的实际,系统和用户时间以及最大内存消耗。 所有系统都不支持最大内存消耗,如果不支持,通常显示为0。

-benchmark_all ( global)

在编码过程中显示基准信息。 显示在各个步骤(音频/视频编码/解码)中使用的实际,系统和用户时间。

-timelimit duration ( global)

在ffmpeg运行 duration 秒后退出。

-dump ( global)

将每个输入数据包转储到stderr。

-hex ( global)

当转储数据包时,也转储有效载荷。

-re ( input)

以本机帧速率读取输入。 主要用于模拟抓取设备或实时输入流(例如,从文件读取时)。 不应该与实际的抓取设备或实时输入流一起使用(它可能导致数据包丢失)。 默认情况下, ffmpeg 会尝试尽可能快地读取输入。 该选项将会将输入的读数减慢到输入的本地帧速率。 它对实时输出(例如直播)非常有用。

-loop_output number_of_times

对于支持循环的格式(如动画GIF)(0会无限循环输出),会重复循环输出。 此选项已弃用,请使用-loop。

-vsync parameter

视频同步方法。 由于兼容性原因,旧值可以指定为数字。 新添加的值必须始终指定为字符串。

0, passthrough

每帧都将其时间戳从分路器传递到复用器。

1, cfr

帧将被复制并丢弃以达到所要求的恒定帧速率。

2, vfr

帧通过它们的时间戳或丢弃,以防止2帧具有相同的时间戳。

drop

作为传递但破坏所有时间戳,使得复用器基于帧速率生成新的时间戳。

-1, auto

取决于复用器功能,可在1和2之间选择。这是默认方法。

请注意,在此之后,时间戳可能会被复用器进一步修改。 例如,在格式选项 avoid_negative_ts 被启用的情况下。

使用-map,您可以选择从哪个流中获取时间戳。 您可以保持视频或音频不变,并将其余流同步到未更改的视频或音频。

-frame_drop_threshold parameter

帧丢弃阈值,指定在视频帧丢失之前它们可以落后多少。 在帧率单位中,所以1.0是一帧。 默认值是-1.1。 一个可能的用例是在嘈杂的时间戳的情况下避免framedrops,或者在精确时间戳的情况下增加帧丢弃精度。

-async samples_per_second

音频同步方法。 "拉伸/挤压"音频流以匹配时间戳,参数是音频改变的每秒最大采样数。 -async 1是一种特殊情况,其中只有音频流的开始被校正而没有任何稍后的校正。

请注意,在此之后,时间戳可能会被复用器进一步修改。 例如,在格式选项 avoid_negative_ts 被启用的情况下。

此选项已被弃用。 改为使用 aresample 音频过滤器。

-copyts

不要处理输入时间戳,而是保持它们的值而不尝试对它们进行消毒。 特别是,不要删除初始开始时间偏移值。

请注意,根据 vsync 选项或特定的复用器处理(例如,如果启用格式选项 avoid_negative_ts ),输出时间戳可能会与输入时间戳不匹配,即使此操作 选项被选中。

-start_at_zero

copyts 一起使用时,请移动输入时间戳,以便它们从零开始。

这意味着使用例如 无论输入文件的起始时间是什么, -ss 50 都会使输出时间戳从50秒开始。

-copytb mode

指定如何设置流拷贝时的编码器时基。 mode 是一个整数值,可以假定以下值之一:

1

使用分路器时基。

时基从相应的输入分路器复制到输出编码器。 有时需要这样做以避免在复制具有可变帧频的视频流时非单调增加时间戳。

0

使用解码器时基。

时基从相应的输入解码器复制到输出编码器。

-1

尝试自动做出选择,以便生成一个理智的输出。

Default value is -1.

-enc_time_base[: stream_specifier] timebase ( output,per-stream)

设置编码器时基。 timebase 是一个浮点数,并且可以采用以下值之一:

0

根据媒体类型分配默认值。

对于视频 - 使用1 /帧率,对于音频 - 使用1 /采样率。

-1

尽可能使用输入流时基。

如果输入流不可用,则将使用默认时基。

>0

使用提供的数字作为时基。

该字段可以作为两个整数(例如1:24,1:48000)的比率或作为浮点数(例如0.04166,2.0833e-5)提供,

默认值是0。

-bitexact ( input/output)

为(反)复用器和(de / en)编码器启用bitexact模式

-shortest ( output)

最短输入流结束时完成编码。

-dts_delta_threshold

时间戳不连续增量阈值。

-muxdelay seconds ( input)

设置最大多路解码延迟。

-muxpreload seconds ( input)

设置初始解复用延迟。

-streamid output-stream-index: new-value ( output)

为输出流分配一个新的stream-id值。 这个选项应该在它应用的输出文件名之前被指定。 对于存在多个输出文件的情况,可将streamid重新分配给不同的值。

例如,要将输出mpegts文件的流0 PID设置为33并将流1 PID设置为36,请执行以下操作:

ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts
-bsf[: stream_specifier] bitstream_filters ( output,per-stream)

为匹配流设置比特流筛选器。 bitstream_filters 是一个逗号分隔的比特流筛选器列表。 使用 -bsfs 选项来获取比特流筛选器的列表。

ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt
-tag[: stream_specifier] codec_tag ( input/output,per-stream)

强制标记/ fourcc匹配流。

-timecode hh: mm: ssSEP ff

指定时间码进行写入。 对于非丢弃时间码, SEP 为':',drop为';'(或'。')。

ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
-filter_complex filtergraph ( global)

定义一个复杂的滤波器图,即具有任意数量的输入和/或输出的滤波器图。 对于简单的图形 - 那些具有一个输入和一个相同类型输出的图形 - 请参阅 -filter 选项。 filtergraph 是filtergraph的描述,如ffmpeg-filters手册的"Filtergraph语法"一节中所述。

输入链接标签必须使用 [file_index:stream_specifier] 语法(即与 -map 使用的相同)引用输入流。 如果 stream_specifier 匹配多个流,则将使用第一个流。 未标记的输入将连接到匹配类型的第一个未使用的输入流。

输出链接标签用 -map 引用。 未标记的输出被添加到第一个输出文件。

请注意,使用此选项,可以仅使用lavfi来源而不使用正常输入文件。 例如,要通过视频叠加图片(添加水印)

ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map
'[out]' out.mkv

这里 [0:v] 是指第一个输入文件中的第一个视频流,它链接到覆盖过滤器的第一个(主)输入。 类似地,第二输入中的第一视频流链接到叠加的第二(叠加)输入。

假设每个输入文件只有一个视频流,我们可以省略输入标签,所以上面的内容相当于

ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map
'[out]' out.mkv

此外,我们可以省略输出标签,并且过滤器图形的单个输出将自动添加到输出文件,因此我们可以简单地写入

ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv

使用lavfi color 来生成5秒的纯红色视频源:

ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
-filter_complex_threads nb_threads ( global)

定义用于处理filter_complex图形的线程数。 与filter_threads类似,但仅用于 -filter_complex 图。 缺省值是可用CPU的数量。

-lavfi filtergraph ( global)

定义一个复杂的滤波器图,即具有任意数量的输入和/或输出的滤波器图。 相当于 -filter_complex

-filter_complex_script filename ( global)

该选项类似于 -filter_complex ,唯一的区别是它的参数是要从中读取复杂的filtergraph描述的文件的名称。

-accurate_seek ( input)

该选项使用 -ss 选项启用或禁用在输入文件中精确搜索。 它是默认启用的,所以在转码时寻找是准确的。 使用 -noaccurate_seek 将其禁用,这可能很有用,例如 当复制一些流并转码其他流时。

-seek_timestamp ( input)

此选项启用或禁用通过 -ss 选项通过输入文件中的时间戳搜索。 它默认是禁用的。 如果启用, -ss 选项的参数被视为实际时间戳,并且不会被文件的开始时间所偏移。 这仅适用于不从时间戳0开始的文件,例如传输流。

-thread_queue_size size ( input)

此选项设置从文件或设备读取时排队数据包的最大数量。 对于低延迟/高速直播流,如果没有及时读取数据包,数据包可能会被丢弃; 提高这个值可以避免它。

-sdp_file file ( global)

将输出流的sdp信息打印到 文件。 这允许在至少一个输出不是rtp流时转储sdp信息。 (要求至少有一种输出格式为rtp)。

-discard ( input)

允许在分路器中丢弃特定的流或帧流。 并非所有的demuxers都支持这一点。

none

丢弃没有框架。

default

默认值,不丢弃任何帧。

noref

丢弃所有非参考帧。

bidir

丢弃所有的双向帧。

nokey

丢弃除关键帧之外的所有帧。

all

丢弃所有帧。

-abort_on flags ( global)

停止并在各种条件下中止。以下标志可用:

empty_output

没有数据包被传递到复用器,输出是空的。

-xerror ( global)

出错时停止并退出

-max_muxing_queue_size packets ( output,per-stream)

当转码音频和/或视频流时,ffmpeg将不会开始写入输出,直到每个这样的流有一个数据包。 在等待这种情况发生时,其他数据流的数据包将被缓冲。 此选项为匹配的输出流设置此缓冲区的大小(以数据包为单位)。

此选项的默认值应该足够大,以便在大多数情况下使用,因此只有在确定需要时才可以触摸此选项。

作为特殊例外,您可以使用位图字幕流作为输入:它将被转换为与文件中最大视频大小相同的视频,如果不存在视频,则会将其转换为720x576。 请注意,这是一个实验和临时解决方案。 一旦libavfilter对字幕有适当的支持,它将被删除。

例如,要在以MPEG-TS格式存储的DVB-T录像上对字幕进行硬编码,将字幕延迟1秒钟:

ffmpeg -i input.ts -filter_complex \
  '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
  -sn -map '#0x2dc' output.mkv

(0x2d0,0x2dc和0x2ef分别是视频,音频和字幕流的MPEG-TS PID; 0:0,0:3和0:7也可以工作)

5.12 预设文件

预设文件包含一系列 选项 = 对,每行一个,指定一系列选项,这些选项在命令行中很难指定。 以散列('#')开头的行将被忽略并用于提供注释。 查看FFmpeg源代码树中的 presets 目录作为例子。

有两种类型的预设文件:ffpreset和avpreset文件。

5.12.1 ff预设文件

使用 vpre apre spre fpre 选项指定ffpreset文件。 fpre 选项将预设的文件名替换为预设名称作为输入,并可用于任何类型的编解码器。 对于 vpre apre spre 选项,预设文件中指定的选项将应用于当前选定的编解码器, 预设选项。

传递给 vpre apre spre 预设选项的参数根据以下规则标识要使用的预设文件:

首先,ffmpeg在目录 $ FFMPEG_DATADIR (如果设置)和 $ HOME / .ffmpeg 中搜索名为 arg .ffpreset的文件,并在 按照该顺序,在配置时间(通常为 PREFIX / share / ffmpeg )或在win32上的可执行文件的 ffpresets 文件夹中定义数据目标。 例如,如果参数是 libvpx-1080p ,它将搜索文件 libvpx-1080p.ffpreset

如果找不到这样的文件,那么ffmpeg将在上述目录中搜索名为 codec_name - arg .ffpreset的文件,其中 codec_name 是将应用预设文件选项的编解码器的名称。 例如,如果您使用 -vcodec libvpx 选择视频编解码器并使用 -vpre 1080p ,那么它将搜索文件 libvpx-1080p.ffpreset SAMP>。

5.12.2 av预设文件

avpreset文件是通过 pre 选项指定的。 它们与ffpreset文件类似,但它们只允许编码器特定的选项。 因此,无法使用指定编码器的 选项 = 对。

当指定 pre 选项时,ffmpeg将查找目录 $ AVCONV_DATADIR (如果设置)和 $ HOME / .avconv中带有后缀.avpreset的文件 和配置时定义的数据目录(通常是 PREFIX / share / ffmpeg )。

首先,ffmpeg在上述目录中搜索名为 codec_name - arg .avpreset的文件,其中 codec_name 是其编解码器的名称 预设文件选项将被应用。 例如,如果您使用 -vcodec libvpx 选择视频编解码器并使用 -pre 1080p ,那么它将搜索文件 libvpx-1080p.avpreset SAMP>。

如果找不到这样的文件,那么ffmpeg将搜索一个名为的文件 arg.avpreset in the same directories.

6 例子

6.1 视频和音频抓取

如果您指定输入格式和设备,则ffmpeg可以直接抓取视频和音频。

ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg

或者使用ALSA音频源(单声道输入,卡ID为1)而不是OSS:

ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg

请注意,您必须启动正确的视频源和频道才能与任何电视观众(例如Gerd Knorr的 xawtv )启动ffmpeg。 您还必须使用标准调音台正确设置音频记录级别。

6.2 X11 抓取

通过ffmpeg抓取X11显示屏

ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg

0.0是您的X11服务器的display.screen编号,与DISPLAY环境变量相同。

ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg

0.0是您的X11服务器的display.screen编号,与DISPLAY环境变量相同。 10是抓取的x偏移量和20的y偏移量。

6.3 视频和音频文件格式转换

任何支持的文件格式和协议都可以作为ffmpeg的输入:

例子:

  • 您可以使用YUV文件作为输入:
    ffmpeg -i /tmp/test%d.Y /tmp/out.mpg
    

    它将使用这些文件:

    /tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,
    /tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...
    

    Y文件使用两倍的U和V文件的分辨率。 它们是原始文件,没有标题。 它们可以由所有体面的视频解码器生成。 如果ffmpeg无法猜测它,则必须使用 -s 选项指定图像的大小。

  • 您可以从原始YUV420P文件输入:
    ffmpeg -i /tmp/test.yuv /tmp/out.avi
    

    test.yuv是一个包含原始YUV平面数据的文件。 每个帧由Y平面组成,后面是垂直和水平分辨率为半的U和V平面。

  • 您可以输出到一个原始的YUV420P文件:
    ffmpeg -i mydivx.avi hugefile.yuv
    
  • 您可以设置多个输入文件和输出文件:
    ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
    

    将音频文件a.wav和原始YUV视频文件a.yuv转换为MPEG文件a.mpg。

  • 您也可以同时进行音频和视频转换:
    ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2
    

    以22050 Hz采样率将a.wav转换为MPEG音频。

  • 您可以同时编码为多种格式,并定义从输入流到输出流的映射:
    ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2
    

    将64位的a.wav转换为128位的b.mp2。 '-map file:index'按照输出流定义的顺序指定哪个输入流用于每个输出流。

  • 您可以转码解密的VOB:
    ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi
    

    这是一个典型的DVD翻录示例; 输入是一个VOB文件,输出一个带有MPEG-4视频和MP3音频的AVI文件。 请注意,在此命令中,我们使用B帧,因此MPEG-4流与DivX5兼容,并且GOP大小为300,这意味着对于29.97fps的输入视频,每10秒钟一帧内帧。 此外,音频流是MP3编码的,因此您需要通过传递 - enable-libmp3lame 来启用LAME支持。 该映射对于DVD转码来获得所需的音频语言特别有用。

    注:要查看支持的输入格式,请使用 ffmpeg -demuxers

  • 您可以从视频中提取图像,或从多个图像创建视频:

    为了从视频中提取图片:

    ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
    

    这将从视频中每秒提取一个视频帧,并将它们输出到名为 foo-001.jpeg foo-002.jpeg 等文件中。图像将被重新缩放 以适应新的WxH值。

    如果只想提取有限数量的帧,可以将上述命令与 -frames:v -t 选项结合使用, ss从某个时间点开始提取。

    用于从许多图像创建视频:

    ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi
    

    语法 foo-%03d.jpeg 指定使用十进制数字 由三个用零填充的数字组成以表示序列 数。 它与C printf函数支持的语法相同,但是 只有接受正常整数的格式才是合适的。

    导入图像序列时,-i也支持扩展 通过选择内部通配符模式(globbing) image2特定的 -pattern_type glob 选项。

    例如,用于根据匹配glob模式的文件名创建视频 <代码> FOO - * JPEG

    ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi
    
  • 您可以在输出中放入许多相同类型的流:
    ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut
    

    生成的输出文件 test12.nut 将包含前四个流 从输入文件以相反的顺序。

  • 强制CBR视频输出:
    ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
    
  • 四个选项lmin,lmax,mblmin和mblmax使用'lambda'单位, 但是你可以使用QP2LAMBDA常量来轻松地从'q'单位转换:
    ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext
    

7 其他文档

ffmpeg-all, ffplay, ffprobe, ffmpeg-utils, ffmpeg-scaler, ffmpeg-resampler, ffmpeg-codecs, ffmpeg-bitstream-filters, ffmpeg-formats, ffmpeg-devices, ffmpeg-protocols, ffmpeg-filters

8 作者

FFmpeg 开发者.

有关作者的详细信息,请参阅项目的Git历史记录 (git://source.ffmpeg.org/ffmpeg),例如 通过输入命令 在FFmpeg源代码目录下的 git log ,或者浏览 在线存储库,网址为 http://source.ffmpeg.org

文件中列出了特定组件的维护人员 源代码树中的 主要维护者

这份文件是于2018年5月14日使用 makeinfo 产生的。 Mr.CC翻译