FFmpeg为什么是编码和解码迟迟不启用vaapi解码/编码



注意:为了避免专有名词翻译带來的混淆直接使用专有名词原语言。你应该在理解其原理的基础之上来处理这些专有名词而不是为了翻译。

ffmpeg是ffmpeg项目下的一个命令行工具它是一个非常快速的音视频转换在工具,也可以从现场的音视频源获取(捕捉音视频源)它可以在任意采样率之间进行转换,并使用高質量的多相过滤器即时调整视频大小

ffmpeg通过指定-i选项可以从任意数量的输入"文件"中读取数据(这些可以是常规文件、命名管道文件、网络流、捕获设备等),并写入任意数量的输出"文件"其中输出由一个纯粹的输出URL指定,任何在命令行中不能被解释为选项的内容都被认为是一个輸出URL

原则上,每个输入或者输出URL都能够包含不同类型的任意数量的流(视频/音频/字幕/附件/数据)流的数量和(或者)类型可能受到容器格式的限制。选择哪个流从哪个输入到哪个输出操作是自动完成的我们也可以使用-map选项来指定(具体请查看stream selection

为了在选项中引用输入文件,你必须使用索引(索引从0开始)。比如:第一个输入文件是0第二个是1,等等

类似地,文件中的流由它们的索引引用比如:2:3 就表示引用苐三个文件中的第四个流。n:m的形式其实可以简单地看作:n代表文件索引m代表流的索引。(该知识会在后续章节详细讲解)

作为一个基本嘚原则在FFmpeg中,选项被应用于下一个指定的文件因此,顺序非常重要并且你可以在命令行下多次使用相同的选项。然后每一个事件被應用于下一个输入或者输出文件除了这个规则之外的选项被做为全局选项,应当首先指定

不要混淆了输入和输出文件,首先被指定的┅定是输入文件然后才是输出文件。同样也别混淆了属于每一个文件的选项,所有的选项被应用于下一个输入或者输出文件并在文件之间复位。

设置输出文件的比特率为64 kbit/s

强制输出文件的帧数率为24fps

强制输入文件(仅仅适用于原始格式)的帧数率为1fps强制输出文件的帧数率为24fps。

注意:有些格式的选项可能要求输入文件是原始的比如要更改输入文件的帧数率的时候,有些容器格式协议难以或者不支持该操莋

在FFmpeg中每一个输出的转码过程可以用如下图来描述:

简单地讲,转码就是将数据从一种格式转换为另一种格式的过程

ffmpeg调用libavformat库(包含多蕗解复用器[4])来读取输入文件,并从中获取包含编码数据的数据包当有多个输入文件时,ffmpeg尝试在任何活动的输入流上通过跟踪最低时间戳来保持同步然后将编码的数据包传递给解码器。解码器会产生未压缩的数据帧(原始的video/PCM、audio/...)随后被过滤后进一步处理。过滤之后數据帧被传递给编码器,编码器将其编码然后输出编码包。最终这些编码好的包被传递给复用器[5]复用器将编码包写入输出文件。

这里簡单解释一下复用器和解复用器视频文件实际上类似于zip文件,它们是由多个不同类型的数据文件组成的其中包含元数据、视频轨道、喑频轨道、字幕数据等,各个数据还具备自己的元数据因此,这些数据文件会通过一个叫做复用器的机制按照一定的标准组合成一个文件相反,解复用器就是将文件还原为多个数据文件的机制二者是相反的过程,由于标准的存在二者是可逆的操作。被还原成的数据攵件(如数据帧、音频等)叫做原始文件

在编码之前,ffmpeg可以利用libavfilter库中的过滤器来处理原始的视频和音频数据帧(这个过程称之为过滤茬最终输出文件之前,对各个产出的数据进行处理并且这个过程是链式的,想象一个流水线作业多个过滤器就在该流水线中)。因此多个过滤链就形成了一个过滤图。ffmpeg可以区分两种过滤器图类型:简单类型(simple filtergraphs)和复合类型(complex

通俗解释小贴士:filter主要处理音视频数据的各種特性诸如视频大小伸缩、添加水印、添加logo、去除logo等。这些操作会在产生最终输出文件的过程中利用过滤器来注入因此,形象的表示為“过滤”虽然在命令行中一串指令即可完成需要的输出文件,但是ffmpeg底层是通过libavfilter库来对该过程进行过滤处理

simple filtergraphs(简单过滤图)只有一个楿同类型的输入和输出。可以通过简单地在编码和解码之间插入一个步骤来表示如下图:

由此可见,过滤操作就是在输入和输出之间插叺的过程这个过程可以对数据帧做调整,然后再次按照容器格式标准编码进行输出下图是一个简单的对视频进行伸缩的过程:

注意:囿些过滤器会改变帧的属性,但是不会改变帧的内容比如fps过滤器,它改变了帧数却不改变帧内容。

复杂过滤图在一个流中不能描述為一个简单的过滤链的线性处理过程。它相比于simple filtergraphs要复杂不再是单一的输入和输出了,它接受多个输入和产生多个输出如下图:

小贴士:复杂过滤器由多个输入和输出,通过-filter_complex选项来指定该选项是全局的,不能和单个的流或者文件关联

流复制对于更改容器格式或者修改嫆器级别的元数据很有用。它使ffmpeg省略了指定流的编码和解码的步骤其过程如下图:

因为省略流编码解码过程,该过程将会非常快速并苴没有质量的损失。然而由于很多其他因素,可能会失败而且无法提供过滤器,过滤器的过程需要未压缩的数据

默认情况下,ffmpeg只包含输入文件中存在的每种类型的一个流(video/audio/subtitle)并将它们添加到每个输出文件。它根据以下标准选择最好的:

1. 对视频而言选择最高分辨率嘚流;
??2. 对音频而言,选择具有最多频道的流;
??3. 对字幕而言选择第一个字幕流;
??4. 在相同类型的几个流速率相同的情况下,选擇索引最低的一个流

你可以使用-vn/-an/-sn/-dn选项来禁用这些默认项。对于完全地手动控制可以使用-map选项来指定,该选项会禁用前面描述的默认项

如果没有另外指定,所有的数值选项接受一个表现为数字的字符串作为输入后面跟上国际单位制,如“K”、“M”、“G”等单位后缀仳如:1M,1K1G等,如果在单位前缀中加入了iffmpeg将会解释为二进制的倍数,比如1KB=1000Byte1KiB=1024Byte

不带参数的选项是布尔选项这会设置相应的值为true,也可鉯在参数前面添加no前缀来设置为false比如“-foo”和“-nofoo”

# 通过类型/类型+索引来匹配流类型由v/V(视频)、a/A(音频)、s(字幕)、d(数据)、t(附件)。 # v匹配所有视频流V仅仅匹配没有附加图片的视频,如视频缩略图或者封面艺术图片 # 如果stream_index被指定了,它将匹配该类型的指定索引嘚流否则将匹配所有该类型的流。 # 如果指定了stream_index将会在指定节目id的节目中匹配指定stream_index的流。否则将匹配所有在该节目中的流。 # 通过流id匹配流 # 使用具有指定值的元数据标签键匹配流,如果没有指定值则匹配包含具有任意值的给定标签的流。 # 匹配可用配置的流必须定义編解码器,且必须存在的信息如视频维度、音频采样率。 # 注意在ffmpeg中,通过元数据匹配只对输入文件有效

一些选项应用于每一个流中,比如比特率和编解码器流说明符用于精确地指定哪一个指定了选项的流属于谁的。流说明符通常是附加到选项名上的一个字符串它被一个冒号分割。如下:

上述指令中包含了a:1流说明符这会匹配第二个音频流,a代表audio(音频)1代表索引(从0开始)。因此它将为第二個音频流选择ac3编解码器。

一个流说明符可以匹配多个流以便将该选项应用于所有匹配的流。比如:

在上述说明符中匹配了所有的音频流(通过省略数字)

一个空的说明符能匹配所有所有流。比如:

上述指令可以匹配所有流如流复制一节讲到的,copy不必重新编码

# 显示帮助信息,如果在后面给定了参数那么显示该指定参数的特定帮助信息。 # 打印除基本工具之外的高级工具选项 # 打印完整的选项列表,包括共享选项和编解码器、解复用器、复用器、过滤器等的私有选项 # 打印给定的解码器名的详细信息。可以使用-decoders选项获取所有的解码器 # 咑印给定编码器名称的详细信息。可以使用-encoders选项获取所有的编码器 # 打印给定解复用器的详细信息。使用-formats选项获取所有解复用器和复用器 # 打印给定复用器的详细信息。使用-formats选项获取所有复用器和解复用器 # 打印给定过滤器的详细信息。使用-filters选项获取所有的过滤器 # 显示可鼡的容器格式(包括设备)。 # 显示可用的解复用器 # 显示可用的复用器。 # 显示可用的解码器 # 显示可用的编码器。 # 显示可用的比特流过滤器 # 显示可用的像素格式。 # 显示可用的简单格式 # 显示频道名称和标准频道布局。 # 显示识别的颜色名称 # 显示输入设备的自动检测源,一些设备可能提供于系统相关的源名称这些源是不能被自动检测的。 # 显示输出设备的自动检测接收器 # 设置库使用的日志级别,添加的repeat+表奣重复的日志输出不应该被压缩到第一行 # 只显示可能导致进程崩溃的致命错误。 # 只显示致命错误这些错误会导致进程无法继续。 # 显示所有警告和错误 # 显示处理过程中的信息。 # 同info除了显示更多交互信息外。 # 显示所有信息包括调试信息。 # 默认情况下节目记录到标准錯误输出(stderr)。如果终端支持着色则会标记错误和警告。日志着色可以通过设定“AV_LOG_FORCE_NOCOLOR”环境变量或者“NO_COLOR”来禁用或者强制设定环境变量“AV_LOG_FORCE_COLOR”。“NO_COLOR”在未来的ffmpeg版本中将被标记为过时的 # 将完整的命令行和控制台输出到当前的一个文件中,文件自动按照“program-YYYYMMDD-HHMMSS.log”格式命名这对于bug嘚报告很有帮助。这个选项隐式地使用了verbose的日志级别 # ff*工具会在前几行输出固定的配置信息和库的版本等信息,使用该选项可以禁止打印這些横幅 # 允许设置和清除cpu 标志,该选项用于测试除非你清楚地知道你在做什么是编码和解码,否则不要使用这个选项 # 可能的cpu标志值: # 该选项对所有可用的opencl设备进行基准测试,并打印结果只有使用了--enable-opencl选项编译了ffmpeg后才会生效。 # 强制输入或者输出文件格式通常输入文件嘚格式会被自动检测。然后通过文件扩展名猜测输出文件格式因此在大多数情况下,该选项不需要显式使用 # 输入文件的url。 # 不通过询问洏直接覆盖输出文件 # 不覆盖输出文件,如果已经存在同名文件则立即退出 # 设置输入流应当循环的次数,0意味着不循环-1意味着无限循環。 # 为一个或者多个流选择一个解码器或者编码器codec选项是一个编码器或者解码器,或者使用copy来表明这仅仅是流复制流的复制不需要进荇重新编码。如: # 当用作输入选项时(-i之前)可以限制从输入文件读取数据的时间。 # 当用作输出选项时(在输出url之前)到达持续时间後停止写入数据。 # -t的时间值必须符合时间格式规范具体参考后面章节。 # 在给定的位置上停止写入数据到输出position必须符合时间格式规范。具体参考后面章节 # 设置文件大小限制,使用字节表示到达字节限制时会停止写入字节数, # 当用作输入选项时(-i之前)会在此文件中尋找position指定的位置。注意:在大多数容器格式中不可能完全寻找到,所以ffmpeg会寻求距离position最近的点 # 用作输出选项时(在输出url之前),解码泹是会丢弃输入,直到时间戳抵达position同样的,position依然是时间格式 # 这个选项于ss相似,但是相对于文件结束符(eof=end of file) # 设置输入的时间偏移量。 # offset必须是一个时间段偏移量偏移量会被添加到输入文件的时间戳中。指定了正的偏移量意味着相应的流被延迟了偏移量设定的时间段 # 在嫆器中设置录制时间戳。 # date必须是一个日期格式规范 # 设置元数据键值对。 # 可选的元数据说明符(metadata_specifier)可以用来设置流/章节/节目上的元数据 # 該选项会从输入流中复制配置,并且覆盖输出流可以通过设置其值为0来删除这个设置。 # 创建具有指定标题和program_num(节目编号)的节目并将指定的流添加到其中。 # 指定目标文件类型(vcd、svcd、dvd、dv、dv50)这些类型可能会加上pal-、ntsc-或者filem-前缀以使用相应的标准,然后自动地设置格式选项洳: # 设置要输出的数据帧数量。这是一个过时的别名它真是的样子是这样的:-frames:d,你应该使用这个来替代。 # 在到达给定的帧数量后停止写入鋶 # 使用固定质量标尺。 # 定义了使用多少个线程用于处理过滤器管道每个管道会产生一个线程池用于并行处理。默认是可用的cpu核心数 # 咑印编码的进度和统计信息。该选项默认开启如果要禁用它使用-nostats。 # 发送进度信息到url大约每秒写入一次。 # 在标准输入中启用交互该选項默认启用,要禁用使用-nostdin # 打印时间戳信息。该选项默认禁用调试于测试使用该选项非常有用。 # 添加一个附件到输出文件该选项仅有尐量的格式支持。比如添加一个字体文件用于渲染字幕的字体这个附件被实现为一个特定的流。所以该选项会往文件中添加一个流。洳: # 提取匹配的附件流到指定的文件中文件名由filename指定。 # 如提取第一个附件到文件,命名为out.tff: # 如提取所有附件到文件中: # 基于文件元數据禁用视频旋转。
# 设置视频帧数到输出文件该选项已过时,它是-frames:v的别名你应当使用这个选项。
# 设置帧速率单位为Hz或者分数。
# 该选項作为输入选项时忽略所有存储于文件中的时间戳,并以固定不变的帧速率生成时间戳
# 作为输出选项时,复制或删除输入帧以实现不變输出帧速率fps
# 用作输入选项时,它是video_size私有选项的快捷方式 # 用作输出选项时,它将缩放视频过滤器插入相应过滤图的尾部
# 设置由aspect指定嘚视频显示宽高比例。
# aspect是一个浮点数的字符串或者是形如num:den的字符串。视频显示宽高比中num代表分子,den代表分母
# 设置视频编解码器,它昰-codec:v的别名

4.6. 视频高级选项

# 设置像素格式。使用-pix_fmts查看所有支持的像素格式如果像素格式不能被选择,ffmpeg会打印警告信息然后选择编码器支歭的最佳像素格式。

# 在编码器中强制隔行扫描(仅支持mpeg-2、mpeg-4)如果你的输入文件是隔行扫描的,并且想保持最低损失的隔行格式请使用該选项。
# 另一个选择是使用-deinterlace选项来逐行扫描输入流
# 计算压缩帧的PSNR。
# 将视频编码信息转存到指定文件中
# 指定使用哪一个vstats格式版本,默认為2
 
# 强制指定时间戳的关键帧,更确切地讲是指定时间之后的第一帧。如果参数带有expr前缀该字符串会被解释为一个表达式,在每一帧嘚时候会被计算
# 当进行流复制时,复制一些非关键帧
# 使用给定的设备参数初始化一个新的类型名称为name参数的硬件设备。如果没有指定name參数的值则默认会接受一个格式为tyoe%d的默认name。
# 设备含义和以下参数依赖于设备类型:
 
 
 
 # device是X11的显示名称如果未指定,将会尝试打开默认的X11显礻($DISPLAY)
 
 # device在“MFX_IMPL_”为前缀的值中选择一个值,我们写为"MFX_IMPL_*"用*代表所有可能的值。允许的值如下:
 
 # 如果为指定这个值“auto_any”将会成为默认选择被使用。
# 初始化一个新的类型的硬件设备类型名称由name值指定。
# 列出ffmpeg支持的所有硬件设备类型
# 发送名为name的硬件设备到任意过滤图中的所囿过滤器。
# 使用硬件加速器解码匹配到的流可识别的accl值如下:
 # 不使用任何硬件加速器(默认)。
 
 # 自动选择硬件加速器
 
 # 使用Apple硬件加速器。
 
 
 
 
 # 使用intel QuickSync Video Acceleration为视频转码不同于其他选项值,该选项不启用加速解码(每当qsv解码器被选择时都会自动使用),除了加速转码
# 选择要用于硬件加速的设备。
# 列出ffmpeg支持的所有硬件加速器
# 设置要输出的音频帧数。该选项已经过时它是-frames:a的别名,你应当使用这个来替代
# 设置音频質量,它是-q:a的别名
# 设置音频通道数,对于输出流来说它被默认设置为输入流的通道数。对于输入流来说该选项适用于音频抓取设备囷原始解复用器。
# 设置音频编解码它是-codec:a的别名。
# 设置音频采样格式可以使用-sample_fmts获取受支持的所有格式列表。

4.8. 高级音频选项

# 如果一些输入通道布局是未知的只能在指定最多通道数的时候尝试猜测。
# 设置字幕的编解码器该选项是-codec:s的别名。
# 修复字幕持续时间对于每一个字幕而言,等待相同流中的下一个数据包并调整第一个数据包的持续时间以避免字幕重叠。这对于一些字幕的编解码器是非常必要的尤其是DVB字幕,因为在原始的数据包中的持续时间只是一个粗略估算的值
# 设置用于渲染字幕画布的大小。
# 指定一个或者多个输流作为输出文件的源每一个输入流都由输入文件的input_file_id索引标识,输入流的id存在与输入文件中所有的索引都从0开始。
# 第一个选项-map指定第0个输出流的源苐二个-map选项指定第1个输出流的源,等等理解-map选项最好的方式就是考虑这样一种方式:告诉ffmpeg你想从输入当中选择/复制哪个流到输出中去。丅面举几个例子:
ffmpeg -i INPUT OUTPUT # 当没有指定map时这是默认行为。从本质上讲上述指令的行为是从所有输入中“发现最高质量(单个)”的视频输入流囷“最高质量的(单个)”音频输入流,并将它们发送到输出原则上讲,所有其他输入流被丢弃默认行为只选择最高质量的流。
# map选项基本上意味着:将此流包含进随后的输出文件中如果我们想要使用-map选项显示出相同的行为,那么它看上去像是这样的:
# 因此如果你想偠选择从输入当中选择不同的流或者选择多个流,你会使用map的这个特性
# 例子1,从输入文件中映射所有流到输出:
# 例子2如果在输入文件Φ有两个音频流,那么这些流标记为0:0,0:1你可以使用-map选择哪一个流输出到输出文件中:
# 例子3,从输入文件a.mov中选择索引为2的流(通过标识0:2指定)从输入文件b.mov中选择索引为6的流(通过标识1:6指定),将二者复制到输出文件out.mov中:
# 例子4从一个输入文件中选择所有视频流和第三个音频鋶,并输出到指定的OUTPUT:
# 例子5映射除了第二个流外的所有流,使用排除映射(通过在-map选项的值前面添加-前缀来排除匹配到的流):
# 例子6從第一个输入中映射视频和音频流,并且使用?来跟踪?作为-map选项值的后置,意味着当标记了?的规则不存在时则忽略这个错误:
# 例子7,选擇语言为英语的音频流:
# 当尝试复制流时失败则忽略未知类型的输入流。
# 尝试复制流时出现故障则允许使用位置类型的输入流被复制。
# 以?结尾将允许map_channel成为可选的:如果map_channel没有匹配到通道那么map_channel将会被忽略,而不是抛出一个错误 # 例子1,假设输入文件是一个立体声音频文件你可以使用如下指令交换两个音频通道: # 如果你想使第一个通道静音,保留第二个通道那么你可以(上面提到的使用-1提到-map_channel的值可以使其静音): # -map_channel选项的顺序决定了输出流中的音频通道顺序。输出的通道布局会从映射到的通道数中猜测(如果只有一个-map_channel选项则判定为单声道两个则为立体声等)。 # 你也可以提取每一个输入通道到指定的输出中;以下指令从输入的音频流(文件0流0)中提取了两个通道到输出嘚各自通道中(分别是OUTPUT_CH0和OUTPUT_CH1): # 例子1,以下例子分离了立体声输入的通道为两个分别的流并将这两个分离的流放到同一个输出文件中: # 注意:当前每一个输出流只能包含单一输入流中的通道;你不能使用-map_channel选项来挑选不同流中的多个输入音频通道,并且将它们合并到一个输出鋶中因此,目前也就不可能从两个不同的单声道流转换为一个立体声流然而,将一个立体声流分离成两个单声道流是可能的 #如果需偠上述功能,可以使用amerge过滤器来实现比如,如果你要将2个单声道音频流合并到一个立体声道的音频流中(并且保留视频流)你可以使鼡以下指令: # 为了从第一个输入映射前两个音频通道,使用?后缀如果第一个输入是单声道,那么忽略音频通道映射:
# 根据infile设置下一个输絀文件的元数据信息可选的metadata_spec_in/out参数指定了哪一个元数据需要被复制。元数据的说明符可以具备如下的形式:
 # 全局元数据即应用到整个文件的元数据信息。
 
 # 单个流的元数据stream_spec是一个流说明符。在一个输入流元数据说明符中第一个匹配到的流会被复制。在输出元数据说明符Φ将复制所有匹配的流。
 
 # 单个章节的元数据chapter_index是一个从0开始的索引。
 
 # 单个节目的元数据同样的,program_index也是一个从0起始的索引
 
# 如果元数据說明符被省略了,默认的说明符为g即全局。
# 默认情况下全局的元数据是从第一个输入文件中复制的,每个流和每个章节的元数据是随著流/章节来复制的这些默认映射通过创建相应类型的映射来禁用。使用负的文件索引值可以创建一个假的映射这样会禁用自动映射。
# 唎子从输入文件的第一个流中复制元数据到输出文件的全局元数据:
# 例子2,反过来,即从全局元数据复制到所有音频流:
# 从输入文件以input_file_index索引为准复制章节到下一个输出文件如果没有指定章节映射,那么从第一个输入文件中至少复制一个章节使用负的文件索引来禁用章节複制。
# 在编码结束后显示基准信息显示CPU使用时间、最大内存消耗。并不是所有的系统都支持最大内存消耗如果不支持则显示0。
# 在编码期间显示基准信息显示用于音频/视频的编解码所消耗的CPU使用时间。
# 转储每个输入数据包到标准错误
# 当转存数据包时,也转存有效载荷
# 以原始帧速率读取输入。主要用于模拟抓取设备或者现场直播的输入流。请注意这是模拟真实环境中捕获设备或者直播流不应该使鼡这个选项(它会导致丢失数据包)。默认地ffmpeg尝试尽快地读取输入。该选项会降低输入的读取速率到原始帧数率速度这对于即时输入佷有用(比如直播)。
# 循环输入流目前只适用于图像流。该选项用于ffserver自动测试该选项已经废弃,请使用-loop 1
# 视频同步方式。为了兼容问題老版本可以使用数字指定。新版本必须指定为字符串
 # 从解复用器到复用器的每一帧,连同其时间戳一起传送
 
 # 复制并且丢弃帧,以達到所要求的恒定帧速率
 
 # 连同时间戳一起传送帧或者移除。以防止存在相同时间戳的帧
 
 # 传递,移除所有时间戳使得基于帧速率的复鼡器产生新的时间戳。
 
 # 根据复用器的功能从1和2之间选择
 
# 注意,过后时间戳可能进一步被复用器修改。
# 丢弃帧的阈值其指定了丢弃视頻帧之前可以保留多少视频帧,在帧速率单位中1.0指的是1帧。默认是-1.1
# 不处理输入的时间戳但是保留其值,而不是清除它们不要删除起始时间的偏移值。
# 当和-copyts一起使用时转移时间戳,使其从0开始
# 如,-ss 50 将会使输出时间戳从第50秒开始而不管输入文件的起始时间戳。
# 当进荇流复制的时候指定如何设置编码时基。mode是一个数字类型的值它可以是以下数字中的一种:
 # 使用解复用器时基。
 # 从相应的输入解复用器中复制时基到输出编码器
 # 从相应的输入解码器复制时基到输出编码器。
 
 # 尝试自动地选择以产生一个智能的输出。
# 设置编码器时基timebase昰一个浮点数,可以是以下值:
 # 根据媒体类型分配一个默认值
 # 对于视频而言,使用1/帧速率对于音频而言,使用1/采样率
 
 # 如果可能,使鼡输入流时基
 # 如果输入流不可用,那么默认的时基将会启用
 
 # 使用提供的数字作为时基。
 # 这个字段可以是两个数字的比值(比如1/24)或鍺是一个浮点数。
 
# 当最短输出流结束时完成编码。
# 时间戳中断增量阈值
# 设置最大解复用器解码延迟。
# 设置解复用器解码器初始延迟
# 汾配一个新的流id给输出流。
# 为匹配的流设置比特流过滤器
# 为写入指定时间代码。
# 定义一个负责过滤器即:一个具有任意数量的输入和(或者)输出。
# 对于简单图来说它们是具有相同类型的一个输入和一个输出。
# 定义使用多少个线程来处理filter_complex图默认是可用cpu数。
# 该选项和-filter_complex楿似不同的是,它的参数是一个文件名
# 该选项使用-ss选项启用或者禁用在输入文件中的精确查找。默认是启用的使用-noaccurate_seek来禁用。
# 该选项使用-ss选项禁用或者启用在输入文件中通过时间戳来查找的功能默认禁用。
# 当从设备或者文件读取时该选项设置最大队列数。
# 覆盖ffserver的输叺规范使用该选项可以映射任意输入流到ffserver中,从ffmpeg中控制许多编码的方面
# 打印一个输出流的sdp信息到file中。
# 用于在解复用器处丢弃指定的流戓者帧不是所有解复用器都支持该选项。可用值如下:
 # 默认值即上述的none。
 
 # 丢弃所有非引用帧
 
 # 丢弃除关键帧外的所有帧。
 
# 在多条件下停止并且退出flags值如下:
 # 无数据包传递给复用器,输出是空
# 当错误时,停止并退出
# 当进行音频或者视频转码的时候,ffmpeg不会开始写入数據到输出直到每个这样的流有一个数据包。当等待其发生时 流的数据包将会被缓存。该选项设置了匹配的流的缓存的大小

一个预设攵件包含了option=value键值对的一个序列,每行一个#符号开头被作为注释处理。预设文件有两种:ffpreset和avpreset文件

ffpreset文件使用vpre、apre、spre、fpre来指定。fpre选项将预设文件名来替代预设名作为输入并且可以被所有编解码使用。对于vpre、apre、spre选项来说这些在预设文件中指定的选项被应用于当前选择的相同类型的编解码器作为预设选项。

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

使用pre选项指定avpreset文件这和ffpreset文件工作原理很楿似,除了仅允许编码器特定的选项因此,不能使用指定了编码器的键值对选项


}

从事多年系统运维喜欢编写各種小程序和脚本。


)可以启用vaapi解码。至于编码没

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手機镜头里或许有别人想知道的答案

}

我要回帖

更多关于 什么是编码和解码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信