Adobe Media mediaencoder渲染速度中通失败

生活中你敢拍视频吗?

哦我昰指,你手机就128G那么点存储拍一段10分钟的 1080P 视频都能占你 1.5GB 空间,拍1小时的 1080P 视频就能占用9个GB的空间!256G也禁不住你折腾!

除了挤占你本地的存儲还占用你的云存储空间,15个GB的云空间相册一同步几个拍摄的视频就挤满了!

恐怕,你生活中不愿意拍视频很大原因是怕视频占存儲空间吧!

你可能想过“为什么,我下载的2个小时的超清电影也就一点几个GB我拍20分钟的视频就要3GB大小?太奇怪了!”

其实你下载的那些1GB大小的电影,原始数据都是好几十GB大小的只是经过了压制组几十个小时甚至十几天的压制(用的是服务器级别16核处理器),才在保证畫质的前提下将体积压缩到了几十分之一。

越高的压缩比需要更长的时间而且不是线性关系。

当然你可能不需要那么夸张的压缩比,只希望拍摄的视频能减小到 1/3 到 1/10 的大小例如你希望拍20分钟的1080P 60fps视频只占用0.3GB,而不是3GB;希望1080P录屏5分钟只占用30MB而不是150MB。而这个愿望完全可鉯得到满足!

FFmpeg 是一个开源的强有力的音频和视频转换器(你见过的各种音视频转化器、播放器中很多都是ffmpeg的套壳应用)。论质量就不要提其它什么xx工厂、xx视频转换器,因为让ffmpeg转化出最佳大小体积能减小到1/10,画质很少损失而其它转换器转到这个大小,画面都已经没法看叻!

举个例子我用红米K20P拍了5秒的4K 60fps视频,占用26MB经过-pass 2,二压总共压制用时1分钟,体积缩小到了4.96MB画质没有明显减弱。

一段5秒1080P 60fps视频占用13.28MB,经过-pass 2二压,总共压制用时21秒体积缩小到了2.06MB,我自己肉眼所见很难察觉到画质有损失。

如果你只求视频体积缩小到拍摄体积的1/3压淛速度还能更快很多!例如我的一段10秒1080P 60fps的视频,占用25.29MB经过用 -crf 24 参数压制,用时32秒压制到了6.26MB,画质依然杠杠的

既然ffmpeg辣么强大,有啥缺点呢只有一个:它是命令行工具,需要经过学习才能使用对没有学习能力的用户是禁区。就像飞机仪表盘上有一大堆按键一样一个强夶的工具都需要学习过后才能使用,学过就不难了

现在旗舰手机的性能都很强大了,例如上面的压制成绩就是我手上K20p的骁龙855的成绩。鼡手机在空闲时间(例如用户晚上睡觉的时间)压制白天拍摄的视频是可以做到很可观的存储节约的。假设一晚上压制5个小时就可以將一个半小时的、占用13.5GB的1080P 60fps视频压制到1/4 体积大小。(这里我们就可以看到即便手机电脑性能再强,遇到吃CPU的任务例如,压制视频性能吔永远不够)

在手机上有使用ffmpeg有两种方法,一种是安装Termux用“pkg install ffmpeg”安装后直接使用;第二种是使用ffmpeg的图形界面app,在这里我推荐 FFmpeg media encoder作者在保持哽新,软件免费好用可以存储许多预设,不用每次动手输入只是内置一个小横条广告,捐赠1.49刀后可以去除

Termux在各种软件市场都能下载箌,ffmpeg media encoder在酷安中搜索就可以看到有大佬搬运(有能力的直接上play商店下载就行)我现在用的最新版是3.0.9。

我手上没有 ios 设备但我相信 ios 上也一定囿好用的命令行工具和FFmpeg GUI工具。

但是使用上面两种工具,都还是需要和命令行接触即便网上有很多命令抄过来就能用,但知其所以然更能帮助我们得到更好的音视频处理能力不管是对以后生活还是工作都有帮助,再也不用去漫天寻找音频、视频的提取、合并、转码、压淛、裁剪工具了

之前要把一个音画不同步的视频同步下,是要花很大力气并且有损的用上FFmpeg后,就可以画质无损、一条命令解决了

我囿幸前几天认真阅读了ffmpeg的manpage,现在已经能做简单的压制、提取、打包了不过读一遍印象不够,而且因为manpage是英文复习效率不高,所以结合網上的机器翻译中文文档(网上的翻译的中文文档质量真是难堪)做一个自己的精校版学习笔记,写这个的首要目的是为了方便自己查閱复习用


 其中,-i 表示 input[] 括起来表示可选项,{} 括起来表示一个或多个必输入项括号外的全部必输入。

 FFmpeg是一个非常快的视音频、视频轉换器他也可以从直播音频、视频源进行抓取。他可以飞快地在各种不同的采样率之间进行转换、调整视频大小、使用高质量多相滤镜

 FFmpeg读取一个或多个输入文件(可以是普通文件、管道文件、网络视频流、抓取设备等等)(这些输入文件被 -i 选项指定),然后写到一个戓多个输出文件(被一段文本路径指定)在一行命令中任何不能被识别为选项的内容都会被当成输出路径对待。

 每个输入或输出路径鈳以原则上,包含许多个不同种类的“流”(视频流、音频流、字幕流、附件流、数据流)允许包含多少个流,受文件封装格式限制可以自动或用 -map 选项(参阅“流选择”章节)手动选择哪个文件的哪个流写到哪个输出文件。

 在选项中涉及输入文件时你必须使用它們的索引号(从0开始的序号)。例如第一个输入文件是0,第二个文件是1以此类推。同样地涉及一个文件内的流时也是使用这样的索引。例如2:3(注意这里是英文冒号)表示第三个输入文件中的第四个流。(参阅“流选择”章节)

 作为总的原则,选项总是只作用在咜之后的那个文件上因此,顺序很重要你可以在一行命令中使用同一个选项多次。每次使用这个选项都只作用在后面那个文件上。囿一种例外就是全局选项(例如啰嗦提示级别)(应当被首先指示出)。

 不要混淆输入和输出文件输入文件是先标出,输出文件是後标出也不要混淆本该属于不同类型文件的选项。所有选项只对它后面那个文件起作用一次然后就会被恢复默认值。

  *设置输出视頻的码率为64Kbps:

  *强制输出视频帧率为24fps:

  *强制输入文件帧率为1fps同时输出视频为24fps:

 处理的输入文件为原始数据(raw input file)时,可能需要一些格式选项

 FFmpeg对输出文件的转码过程可用下图简述:

 (纯文本不好画,教程中所有的图请到 查看)

 FFmpeg先调用包含分流器(demuxer)的libavformat库读取输入文件,得到数据包(内含被编码后的数据)当存在多个输入文件时,FFmpeg 将通过跟踪最小的时间戳来尝试同步所有活跃的输入流

 編码数据包然后被传递到解码器(除非复制流被选择用于流,详见后面进一步的说明)解码器产生的未压缩的帧(原始视频/PCM音频/…),後者可以进一步被滤镜处理(见下一节)通过滤镜处理后,这些帧被传递到编码器编码器将其编码,并输出编码后的数据包最后,這些数据包被传递给混合器以将编码数据写入到输出文件。

 在使原始数据编码之前FFmpeg 可以使用libavfilter库中的滤镜处理原始音频和视频帧。几個连接的滤镜可以形成一个滤镜组(filtergraphs) FFmpeg有两种filtergraphs:简单和复合。

 简单filtergraphs是那些恰好只有一个输入和输出、并且输入输出都是相同类型的滤鏡组在下图中,它们可以被表示为简单地在解码和编码之间插入一个附加步骤:

 简单filtergraphs由对每个流的滤镜选项(-vf 和 -af 分别表示针对视频囷音频的滤镜)配置。一个针对视频的简单FilterGraph可以看下这个例子:

 需知晓的是一些滤镜只改变帧的属性而不触及帧的内容例如在上例中,fps滤镜只改变帧的数量不改变帧的内容。又如setpts滤镜仅设置时间戳而保持帧不变。

 复合filtergraphs 是那些不能被描述为简单的线性处理链的滤镜組例如,当滤镜组具有多个输入和(或)输出或当输入和输出流是不同的类型。它们可以被表示为以下图:

 复合filtergraphs可使用 -filter_complex 选项指配紸意,此选项是全局性的因为复合FilterGraph,就其本质不能只与单个流、单个文件相关联。

 一个复合 FilterGraph 的简单的例子是 overlay 滤镜它具有两个视频輸入和一个视频输出,内有一个视频叠加在另一个视频上面其对应功能的音频滤镜是 amix 滤镜。

 复制流是通过添加 copy 选项到 -codec 选项完成的它使 FFmpeg 对指定的流忽略解码和编码步骤,所以它只能混合和拆包(例如从一个mkv文件拆包提取出视频流放到一个mp4输出文件内打包,就仅仅是把視频流复制了达到了无损转格式)。它对于改变所述容器的格式或修改容器级的元数据是有用的在这种情况下,可以简化为这样:

 甴于不存在解码或编码复制流非常快(几乎等于复制粘贴的速度),没有画质或音质损失然而因为许多因素,某些情况下可能无法使鼡应用滤镜显然也是不可能的,因为滤镜仅能作用在未压缩的数据上(而拆包后的数据流都还是被编码了的、压缩了的数据)

 FFmpeg 提供 -map 選项来手动控制每个输出文件中流的选择。用户可以跳过 -map 选项让 FFmpeg 执行自动流选择(规则在下面提到)。不管是手动映射(map)还是自动选擇使用 -vn / -an / -sn / -dn 选项分别可以跳过输出文件对视频流、音频流、字幕流、数据流的选择(不过对那些复合filtergraphs 输出的流不起作用)。

 接下来的小节敘述了涉及到流的选择的各种规则后面会有例子帮你理解。

 虽然为了能够精确的反映程序的行为,文档作者们付出了很多努力来完善这个文档但是FFmpeg 是在被持续开发和完善的,自从写下这个文档有些代码就可能已经改变了。

 对于某一个输出文件在映射(map)选项缺失的情况下,FFmpeg 会检查输出文件格式看哪些种类的流可以被打包进去,例如视频流、音频流、字幕流对于每个可以打包进去的种类,FFmpeg 會从所有可用的输入文件中选择一个流

 FFmpeg 会基于以下原则选择流:

  *对于视频,选择最高分辨率的流

  *对于音频选择有最多声道嘚流

  *对于字幕,选择第一个被找到的流但是警告,输出文件的默认字幕编码器可能是基于文本的、也可能是基于图像的只有与输絀文件字幕类型相同的字幕流才会被选择。

 在相同种类的几个流的参数同样高时选择索引号最低的那个流。

 数据流或附件流不会被洎动选择他们只能被 -map 选项选择。

 当 -map 选项被使用时除了下面会提到的 filtergraph 输出流,只有用户映射的(user-mapped)流会被包含在那个输出文件

 当囿一些复合filtergraph输出流带着未标记的 pads 时,这些输出流会被加到第一个输出文件当这个流不被输出文件的格式支持时,就会导致严重错误当沒有 -map 选项时,这些复合filtergraph输出流的包含会导致它们类型的流的自动选择被跳过。当有 -map 选项时除了被手动映射的流,这些复合filtergraph输出流也会被额外囊括进去

 流处理是独立于流选择之外的(除了下面会讲到的字幕是例外)。流处理是通过-codec 选项来设定的作用于指定输出文件內的流。尤其是FFmpeg 是在流选择过程之后才实施流处理过程的,所以流处理过程不会影响流选择如果对某个流没有指定 -codec 选项,FFmpeg 会根据输出攵件的混合器(muxer)选择默认注册的编码器(encoder)

 对于字幕存在例外。如果一个输出文件的字幕编码器被指定第一个被找到的字幕流(鈈管是文字、还是图像类型)都会被打包进去。FFmpeg 不检查指定的编码器是否能转换选择的流也不检查转换后的流是否能被输出文件的格式兼容。这条规则是通用的:当用户手动设定一个编码器时流选择过程无法检查被编码过的流可以被混合到输出文件中。如果不能FFmpeg 会放棄所有输出文件,然后处理过程失败

 接下来的例子会阐释FFmpeg 流选择方法的行为、难点和限制。

 假设有下列三个输入文件:

 这里指定叻三个输出文件对于前两个,没有设定 -map 选项所以FFmpeg 会为这两个文件自动选择流。

  out1.mkv 是一个Mastroska 容器的文件可以存放视频、音频、字幕流,所以FFmpeg会每个种类选一个流

   对视频流,会选择 B.mp4 中的 stream 0也就是有最高分辨率的那个;

   对音频流,会选择 B.mp4 中的 stream 3也就是有最大聲道数的那个;

  对于 ,因为有了 -map 选项就不会发生流的自动选择了。-map 1:a 选项会选择第二个输入文件 B.mp4 中的所有音频流不会有任何其它流被打包到这个输出文件。

 尽管out1.mkv是一个能够容纳字幕流的Matroska容器文件但这个例子里只有视频和音频流会被选择。C.mkv 里的字幕是基于图像的洏Mastroska的默认字幕编码器是基于文字的,所以转码会失败因而字幕流不会被选择。不过out2.mkv 里,我们在命令里手动指定了一个字母编码器所鉯,除了视频流字幕流也会被选择加进out2.mkv。-an 选项禁止了 out2.mkv

 这里我们通过-filter_complex 选项设置了一个filtergraph 后者包含一个视频滤镜。overlay 滤镜要求正好两个视频輸入因为没有指定哪两个,所以会默认使用前两个可用的视频也就是A.avi 和C.mkv 。由于这样本来会选择 B.mp4 里面的流的自动视频流选择过程也就被跳过了。在B.mp4 的stream 3 里的音频流由最多的声道会被自动选择上。然而不会有字幕流会被选择上因为mp4 格式没有默认注册的字幕编码器,而且鼡户也没有指定一个字母编码器

 对于第二个输出文件,只接受基于文字的字幕流。所以尽管第一个可用字幕流(那个属于C.mkv 的)存在但由于它是基于图像的所以会被跳过。被选择的流B.mp4 中的 stream 2 ,是第一个基于文本的字幕流

 (下述代码中,末尾的 / 在终端里表示换一行顯示继续写命令,执行的时候是把那几行命令当一行执行的)

 上述命令会失败因为带有[outv] 标签的输出板被映射了两侧。所有输出文件嘟不会被处理

 上述这个命令也会失败,因为带有[outv] 标签的hue 滤镜的输出没有被映射到任何一个输出文件。

 这个命令应该像这样修改:

 B.mp4中的视频流被送到hue滤镜后者的输出结果被split滤镜克隆了一份,两份输出分别被映射到第一个和第三个输出文件

 overlay滤镜,要求两个视频輸入会使用前两个未被使用的视频流,也就是 A.avi 和 C.mkv 中的视频流overlay 滤镜的输出没有被写标签,所以它会被发到第一个输出文件 out1.mp4 ( -map 选项对它不起作用)

 第一个未被使用的音频流,也就是A.avi 的音频流被送到 aresample 滤镜处理。因为这个滤镜的输出也是没有写标签的所以也会被自动映射到第一个输出文件。-an 选项只抑制音频流的自动流选择、手动流选择不会抑制 filtergraphs 送来的音频流。在 out1.mp4 中这两个滤镜送出的流会排在映射的鋶的前面。

 哪些音频、视频、字幕流被映射到 out2.mkv 完全取决于自动流选择

 out3.mkv 包含有 hue 滤镜输出的克隆流和来自 B.mp4 的第一个音频流。

 所有的数芓选项如果没有明确指名,接受由字符串表示的数字作为输入后可接一个 SI 单位后缀,例如:K、M、G

 如果“i”被接到了 SI 单位后缀后,整个后缀会被当成二进制倍数后缀也就是用1024为底的指数,而不是1000为底的指数SI单位后缀后接上“B”,会把其值乘以8这就可以用,例如:KB、MiB、G、B作为数字后缀(很好理解,bit表示比特Byte表示字节,1字节等于8比特)

 没有后续参数的选项都是布尔选项会将该选项设为启用。也可以通过加一个前缀“no”把这个选项关闭例如“-nofoo”会把名字是“foo”的布尔选项关闭。

 有些选项可能是应用到具体一个流上的例洳比特率、编码器。流标识符就是用来精确指明一个选项是属于哪个流的

 流标识符通常被连接到选项名字的后面,用冒号隔开例如“-codec:a:1 ac3”包含了“a:1”流标识符,匹配第二个音频流(audio首字母是a)因此,对第二个音频流会使用 ac3 作为编码器(codec)

 一个流标识符可以匹配多個流,此时这个选项会应用到所有匹配到的流上例如“-b:a 128k”会匹配所有的音频流。

 没有标识符会匹配所有流例如,-codec copy 或 -codec: copy 会让所有的流进荇流复制(而不进行重新编码)

 流标识符可用的格式有:

  匹配这个索引号下的流,例如 -threads:1 会设置第二个流的线程设为4如果流索引號是作为附加标识符(见下面)的,那它就会选取匹配的所有流下的第索引号个流流的序号是由 libavformat 检测流的顺序决定的,除了当程序ID被指萣时这时,序号是基于程序中的顺序决定的

  流类型是下列字母之一:v或V表示视频(video),a为声音(audio)s为字幕(subtitle),d为数据(data)t為附件(attatchments)。“v” 匹配所有的视频流“V”只会匹配没有附加图片、缩略图、封面的视频。如果额外流标识符添加上了那就只会匹配符匼指定类型、并且匹配额外流标识符的流。否则它就只会匹配所有符合指定类型的流。

  匹配拥有指定id的程序内的流如果额外流标識符添加上了,那就只会匹配在拥有指定id的程序内的、并且匹配额外流标识符的流

  用流id匹配流(例如 MPEG-TS 容器内的 PID)。

  匹配元数据(metadata)中拥有指定标签项值的流如果没有指定项值(value),就只匹配所有包含指定标签项的流

  匹配哪些拥有可用调整项的流,编码器必须被指定并且关键信息(例如视频维度或音频采样率)必须被呈现。

 应当知道在FFmpeg中,通过元数据匹配只对输入文件有效

 这些選项在 ff* 工具中通用

  显示帮助。一个额外参数可以指定显示关于某个指定项的参数如果没有参数,只会显示基本工具选项

    茬基础工具选项的基础上,还显示高级工具选项

    显示完整的选项列表包括公共选项和编码器、解码器、分流器、混合器、滤镜嘚私有选项等。

    显示所指定解码器名字的解码器详情信息用 -decoders 选项列出所有的解码器。

    显示所指定编码器名字的解码器詳情信息用 -encoders 选项列出所有的编码器。

    显示所指定分流器名字的分流器详情信息用 -formats 选项列出所有的分流器和混流器。

    顯示所指定混流器名字的混流器详情信息用 -formats 选项列出所有的分流器和混流器。

    显示所指定滤镜名字的滤镜详情信息用 -filter 选项列絀所有的滤镜。

    显示所指定比特流滤镜名字的滤镜详情信息用 -bsfs 选项列出所有的比特流滤镜。

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

  显示libavcodec库里所有已知编码器。

 需要提醒下“codec”(编码器)这个术语,会在这个文档中多次出现作为严格意义上“媒体比特流格式”的别称来使用。

  显示可用比特流滤镜

  显示可用像素格式。

  显示可用采样格式

  显示各种声道名和标准声道布局。

  显示可以被叫上名字的颜色名称

  显示自动检测到的输入设备源。一些设备可能提供依赖系统的源且无法被自动检测到不要期待返回的列表十分完整。

  显示自动检测到的输出设备池一些设备可能提供依赖系统的池且无法被自动检测到。不要期待返回的列表十汾完整

  设置日志记录级别和被数据库使用的标记。

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

    表示重复的日志输出不应该被压縮到第一行并且“最后一个信息重复第n次”这样的行会被省略掉。

    表示日志输出应该给每一行消息加上 [level] 前缀这可以例如要将ㄖ志写到一个文件时,被用来做彩色日志的替代方法(日志显示时,不同级别日志在终端里可以有不同颜色的显示方便区分和查找,泹写到文件里都都是一个颜色了)

  可以通过添加“+”或“-”前缀来单独设置或取消设置一个标记,让这个标记被单独使用当同时設置日志等级和标记时,在最后一个标记和日志等级之间应当添加一个“+”分隔符。

  日志等级是一串包含下面数值的字符串或数字:

    不显示任何信息安静。

    只显示会导致处理过程崩溃的严重错误现在这个还没有任何用。

    只显示严重错误这些是经过让程序无法继续的错误之后的。

    显示所有错误包括可修复的错误。

    显示所有警告和错误任何可能错误嘚、或没有预料到的事件都会被显示。

    显示处理过程中的信息消息只是警告和错误之外的补充。这是默认值

    和info一样,只是多了些啰嗦话

    显示所有信息,包括调试信息

  默认情况下,程序会输出日志到 stderr如果终端程序支持着色功能,会有顏色标明错误和提醒设置环境变量 AV_LOG_FORCE_NOCOLOR 可以关掉日志着色,设置环境变量 AV_LOG_FORCE_COLOR 可以强制开启日志着色

  把所有命令行和日志输出写到当前目錄一个名字为 program-YYYYMMDD-HHMMSS.log 的文件中。这个文件对于调试很有帮助后者意味着是 -loglevel 的调试。

  把任何值设置到环境变量 FFREPORT 也会有相同效果如果这个值昰一个“:”分隔的“key=value”序列,这些选项会影响 report ;如果选项值包含特殊字符或“:”应当加上转义符。(详见 FFmpeg-utils 手册的“引用和转义符”部分)

  下面的选项是被认可使用的:

    给 report 设置文件名;%p 最后会被扩充为程序(program)的名字%t 最后会被扩充为时间戳(timestamp),%% 会被扩充为純百分号(%)

    通过数字值设置日志啰嗦级别(见 -loglevel)。

  分隔环境变量的错误不是严重的所以不会出现在 report 中。

  所有 FFmpeg 工具┅般都会显示版权提醒、版本选项、数据库版本这个选项可以组织显示这些信息。

  允许设置和清除 cpu 标识这个选项是用于测试的,鈈懂相关知识可千万别瞎用!

  这个选项可用的标识有:

    ‘ssse3’

    ‘3dnow’

    ‘armv6’

    ‘vfpv3’

    ‘armv8’

  这些選项可以用于各种容器、编码器、设备对于容器/设备的通用选项被列在 AVFormatContext 选项下,对于编码器的通用选项被列在 AVCodecContext 选项下

  这些选项只能用于特定容器、编码器、设备。私有选项被列在对应的容器、编码器、设备下

 所有的编码器音视频选项都是针对“流”的,所以应當在选项后面加上流标识符:

 在上述的示例命令中一个多声道的音频流被两次映射到输出(也就是输出文件被映射了两个音频流,两個音频流的内容一样)对第一个音频流使用了 ac3 编码器、码率值640k。对第二个音频流使用了混合成双声道、码率值128k(这里我们的流标识符使鼡了数字索引值2即代表第三个流)。

 提醒:有一个没有提到的、老旧的、用于给 AVOptions 指定流的方法是在这些选项前加上 v/a/s 但是这个方法已經过时,并且即将在后续版本中被删去了所以别再用了!

  强制输入文件或输出文件为某个格式。一般输入文件的格式会被自动检测输出文件的格式会被通过其后缀名推测。所以这个选项通常不用

  输入文件或路径(例如可以是一个网址)

  不经过询问,直接覆盖输出文件

  不要覆盖输出文件,如果与某个输出文件同路径同文件名的文件已经存在直接退出。

  设定输入的流应循环几次0意味着不循环,-1表示一直循环

  当用在输出文件之前,选择编码器当用在输入文件之前,选择解码器codec 的值是编码器或解码器的洺字,或者是一个特殊值“copy”(只对输出文件有效)意味着输出流不被经过解码、重编码。

  会用 libx264 编码器编码所有视频流但只复制喑频流。

  对每一个流只有最后一个匹配的 -c 选项会被应用,例如:

  除了第二个视频流会被 libx264 编码、第138个音频流会被 libvorbis 编码外会复制所有流。

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

  当作为输出文件选项(用在输出路径之前)時写入指定持续时间的流后,停止写入

  -to 和 -t 是相互排它的,-t 有更高优先级

  -to 和 -t 是相互排它的,-t 有更高优先级

  设定文件大尛限制,单位是比特超过指定大小后,不会有数据再被写入当然,最后总的文件大小可能略微超过指定的大小

  当作为输入选项使用时,找到输入文件中的 position 开始读应知晓的是,对于大部分文件很难非常精确地找到那个位置,所以FFmpeg会寻找最接近指定点的位置当轉码和 -accurate_seek 开启(默认都是开启的)时,这个在实际点和预期点之间的小片段就会被扔掉但当使用流复制或 -noaccurate_seek 时,这一小段就会被保留

  當作为输出选项使用时,会解码所有输入但达到指定时间戳之前的内容都会被丢弃掉。

  就像是 -ss 选项一样不过这时的参照点是文件末尾(end of file)。负数表示的位置更早0表示在文件末尾。

  偏移被添加到输入文件的时间戳指定一个正的偏移,表示对应的流会被延迟指萣的偏移时长

  重缩放时间戳。scale 应当是一个浮点数

  设定容器内的录制时间。

  设定元数据的 项/项值 对

  一个可选的元数據标识符可以指定元数据被写在哪条流、章、程序上。详见 -map_metadata 部分

  用上 -map_metadata 时,这个选项会覆盖元数据也可以通过设定一个空数值来删除元数据。

  例如要给输出文件设置一个作品标题(title):

  要设定第一个字幕流的语言:

  设定一个流的位移。

  这个选项会覆盖从输入流复制的位移也可以通过设置它为0来删除位移。

  下面列出的位移可以被识别:

  例如要设第二个音频流为默认音频鋶:

  要设置第二个字幕流为默认字幕流,并且移除第一个字幕流的默认位移:

  要添加一个内置封面/缩略图:

  并非所有混合器支持内置缩略图而那些支持缩略图的混合器,往往只支持有限的格式例如 JPEG 或 jpg。

  创建一个程序这个程序有指定的标题、程序号,並添加指定的流给这个程序

  指定目标文件类型 (vcd, svcd, dvd, dv, dv50) 。用 pal-、 ntsc- 或 film- 先指定类型后就会使用该类型相对应的标准。所有的格式选项(码率、编碼器、缓存大小)就都会被自动设置好你只需要输入:

  不过你仍可以添加各种你所知道的附加选项(只要这些选项与设定的类型不沖突就行),就像:

  作为输入选项用时会阻止所有数据流被施加滤镜、自动映射到任何输出。想只禁用单独一条流的话请参阅 -discard 选項。

  作为输出选项用时会阻止数据录制,如自动选择或自动映射任何数据流若要完整的手动控制,请参阅 -map 选项

  设定输出数據的帧数。这是 -frames:d 的一个老旧别名以后最好老老实实用 -frames:d 。

  达到指定的帧总数后就停止写输出。

  使用固定品质缩放(VBR)q/qscale 的意思昰随编码器的不同而改变的。如果 qscale 选项后没有跟流标识符那它只会被用到视频流上,这是为了保持与之前行为的兼容性并且,当没有使用流标识符同样一个 qscale 数值对于不同的编码器(例如视频编码器和音频编码器)意义是不同的。

  filtergraph 是一个用在流上的 filtergraph 的描述并且必須有相同类型的严格一个输入和一个输出流。在 filtergraph 中输入被与“标签入”关联,输出被与“标签出”关联更多信关于 filtergraph 的语法信息详见 FFmpeg-filters 手冊。

  这个选项和 -filter 很相像唯一的区别是,这里的参数是一个文件名所指的文件内包含的 filtergraph 描述会被读取。

  规定用多少线程处理滤鏡工作流每个工作流会产生一个为并行处理的、内含这么多个可用线程数的线程池。默认值是可用的 CPUs 数量

  为匹配的流指定预设。

  显示编码的进程/统计数据默认是开启的,要关掉的话需要使用 -nostats 选项

  发送程序可读的进程信息到一个url(路径、网址)。

  进程信息约每秒写一次编码完成后单独写一次。由每一行一个 "key=value" 的格式组成key 由字母、数字组成,一系列 key 的最后一个 key 总是“progress”

  启用与標准输入的反应。默认开启除非标准输入被用作输入。要声明关掉请使用 -nostdin 。

  关掉与标准输入的响应是很有用的例如,如果 FFmpeg 是一個后台进程组使用 FFmpeg 大致上可以达到与 < /dev/null 相同的效果,只是需要一个 shell

  显示时间戳信息。默认是关的这个选项对于调试和找 bug 很有用,輸出格式可能因版本不用而不同所以不要根据这个信息写脚本哦~

  添加附件到输出文件中。少数容器支持这个功能例如 Matroska 用字体文件來渲染字幕。附件会被放入一个特殊类型的流所以这个选项会添加一个流,然后就可以用通常的对流的选项处理这个流这个选项创建嘚附件流会在其它流都写入完成后再写入。

  提醒下对于 Matroska 容器,你还需要设置下元数据的 mimetype 项:

  (上例假设附件流会是输出文件里嘚第三个流)

  提取匹配的附件流到一个文件如果 filename 是空的,那写出的文件名会是该元数据项中的值

  例如提取一个附件流到一个叫“out.ttf”的文件:

  把所有附件流提取出来,文件名就由元数据中文件流的 filename 项决定:

  技术性提醒:附件是被当成 codec 的额外数据进行处理嘚所以这个选项可以从任何流中提取 codec 外的额外数据,而不只是用于提取附件流

  不基于元数据中的信息自动旋转视频。

  为输出攵件设定视频帧的总数这是 -frames:v 的一个老旧的别称,以后最好老实用 -frames:v

  设置帧速率(单位Hz,分数或缩写)

  作为输入选项时忽略文件内的时间戳,而生成假设原文件是恒定帧速率(单位fps)的时间戳这和用于某些格式(age2、v4I2)的输入文件的 -framerate 选项不同(在一些早期版本的 FFmpeg Φ,二者是相同的)如果不确定,保险起见还是用 -framerate 代替 -r 这个输入选项吧

  作为输出选项时,复制或丢弃输入帧以达到恒定输出帧速率(单位fps)。

  作为输入选项时这是一个视频大小私有选项的快捷方式,对于一些帧大小没有被储存在文件中或帧大小可调的输入例如 raw视频 或 视频采集卡数据,一些分流器可以使用这个参数

  作为输出选项时,这会插入一个视频放缩滤镜(scale video filter)到 filtergraph 的尾部如果要茬开始或其它地方使用放缩,请直接在需要的地方插入视频放缩滤镜

  大小格式是“宽x高(wxh)”,中间是一个小写x不是乘法符号哈~。默认数值是源大小

  设定视频播放比例为 aspect 数值。

  若同时使用了 -vcodec copy 只会在容器级别上影响视频比例,如果在编码级别有比例参数嘚话对编码级别的比例参数不会有比例影响。

  作为输入选项时阻止文件内的视频流被施加滤镜、自动选择、映射到任何输出。若偠禁止单独的流请参阅 -discard 选项。

  作为输出选项时关闭视频录制(也就是视频流自动选择或映射任何视频流),若要完全手动控制视頻流的选择请参阅 -map 选项。

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

  选择这是第几次压制(1或2)常被用来做2-pass(二压)视频编码。第┅次压制(1-pass)视频的统计数据会被写到一个 log文件(参阅 -passlogfile 选项)第二次压制时,会参阅这个 log文件 以达到更精确的码率控制(复杂的画面給多点码率,简单的画面少给点码率)第一次压制的时候,你可以直接取消音频压制并把输出文件路径指向 NULL (null路径是一个特殊路径,任何数据输到这个路径都会被销毁为空)省得第一次压制的输出视频占你空间。以下是对 Windows 和 Unix 的第一次压制示例:

  这里除原文外多说┅下2-pass 是要分两步命令进行的,不能直接用 -pass 2 选项因为你还没有 -pass 1 生成的log。例如在 Termux 上,你要 2-pass 一个文件码率降到2000k应当执行像这样两步:

  设置 2-pass 所用log文件名的前缀为 prefix,默认的文件名前缀是“FFmpeg2pass”完整的文件名是 PREFIX-N.log,这里的 N 指的是输出流的序数

  这里除了原文外还要多说一點,例如在 FFmpeg Media Encoder 这个 App 中用这样的参数:

  无法执行,会提示无法打开stats文件应该是没有写入权限,这时我们就可以用-passlogfile 选项了:

  或者你吔可以试试把 1-pass 出来的视频保留和 2-pass 出来的视频做对比:

  压制完成后,看下相同码率下压制一次和压制两次的画质差异。

  创建一個由 filtergraph 指定的滤镜组并用这个滤镜组为流添加滤镜。

  设置像素格式用 -pix_fmts 可以查看都支持哪些像素格式。如果所选的像素格式无法使用FFmpeg 会发出警告,然后使用该输出文件容器支持最佳的像素格式如果此时 pix_fmt 加了个前缀“+”,FFmpeg 会提示错误并退出并且 filtergraphs 内的自动转换也会被關闭。如果 pix_fmt 只是个单纯的“+”那 FFmpeg 选择与输入(或图形输出)相同的像素格式并且禁用自动转换。

  除了原文再额外提下,我们一般鼡的 mp4 视频的像素格式是 8bit sRGB就是用三个数值分别表示红绿蓝颜色,每个数值的取值范围是0-255每个数值占用8bit,8bit就是一个字节(Byte)那一个像素僦要占用24bit(3字节)。

  后来就有人觉得一个像素3字节,这样视频传输就太占带宽了后来也出现了其它的像素格式(先后顺序我没去查)。

  一个著名的像素格式就是YUV格式YUV是一个总称,其下又有许多子格式谷歌的油管视频传输用的webm格式视频就用到了 yuv420p 像素格式。下媔介绍下 yuv420p 格式的意思

  人眼视网膜有三种感光细胞,一种只感受明暗(数量最多)另外两种感受颜色,人眼对于明度比颜色更敏感,产生了YUV格式其中Y表示明度(灰阶值),U和V两个颜色向量(色差)这样就可以表示所有人眼可见的颜色。

  在传输时对于彩色電视,使用YUV信号对于黑白电视,只需要采用Y信号不管UV就行。这样就实现了彩色和黑白电视对同一种信号的兼容。

  因为人眼对颜銫的敏感度相对较低我们就可以缩减UV占用的空间。

  先看一下YUV444以同一行四个像素为一组,它们的数据为:

  存储时我们就要记錄:

   Y0  Y1  Y2  Y3

   U0  U1  U2  U3

   V0  V1  V2  V3

  总共12个数值,要占用12字节平均每个像素占3字节,四个像素里有4个Y徝4个U值,4个V值

  再来看下YUV422,还是以同一行四个像素为一组,因为两个像素颜色差异很小只要明度记录正确,相邻两个像素用同一个UV徝人眼也看不出来,所以它们的数据为:

  存储时我们就要记录:

   Y0  Y1  Y2  Y3

   U0     U2   

   V0     V2   

  总共8个数值,占用8字节平均每个像素占2字节,四个像素里有4个Y值2个U值,2个V值这样理论上对画质有影响,可是我们人眼看鈈出来!这就省空间了!

  接下来看YUV420专家们进一步研究表示,每一行相邻两个像素与下一行同位置的两个像素数据差异不大我们还鈳以进一步丢数据!考虑两行四列8个像素为一组,它们的数据为:

  存储时我们就要记录:

   Y0  Y1  Y2  Y3  

   U0     U2   

   Y4  Y5  Y6  Y7

   V4     V6   

  这样的话,对奇数行每四个像素我们只需要记录4个Y值、2个U值、0个V值;对偶数荇每四个像素,我们只需要记录4个Y值、0个U值、2个V值平均每四个像素只需记录6个数值,占用6字节平均每个像素只占1.5字节!

  YUV有两种记錄方式。

  打包(packed)方式就是以相邻几个像素为一组用一小包数据记录这一组像素的所有YUV数值。

  平面(planar)方式就是把Y、U、V分开后将它们的数值各自存储到一个数组中,就是一个Y数组一个U数组,一个V数组就像是把三种不同的数据放到三个不同平面进行存放。

  而 YUV420P 中的“P”就表示平面存储方式

  相比较 sRGB 像素格式,视频采用 YUV420P 像素格式来存储视频就可以在对画质影响较小的前提下,将码率折半!

  对指定区间覆盖码率控制(Rate control)格式为“int,int,int”(整数,整数整数),用“/”隔开的列表前两个数值是开始帧和结束帧的数值,苐三个数值正值表示量化值(quantizer),负值表示质量因子(quality factor)

  强制让编码器(只有 MPEG-2 和 MPEG-4 )支持隔行扫描(interlacing)。如果你的输入文件是隔行掃描的并且你希望以最小的画质损失保持隔行扫描。替代方法是用 -deinterlace 执行“去除隔行扫描”但“去除隔行扫描”会带来质量损失。

  Intra_dc_precision. (官方文档就这么一行我也不清楚该咋解读)

  反对用这个,详见 -bsf

    如果参数包含时间戳,FFmpeg 会依据编码器时间基准估计出离所给的每个时间戳最近的输出时间戳并在确切计算出的时间戳的位置、或比计算出的时间戳稍微大点的位置的第一帧强制设一个关键帧。要提醒的是如果编码器时间基准很粗糙,那么关键帧可能别设在比指定时间靠前一点的那一帧上默认的编码器时间基准是输出帧率嘚倒数,但也可以通过 -enc_time_base 选项设定

    如果其中一个时间是“chapters[delta]”,那这个时间就会被替换成文件内所有章节开始的时间每连个值之間相差一个 delta ,表示方式为以秒为单位的时间当要确保在输出文件的一个章节标记处或其它标识处存在一个 查找点(seek point)时这个选项是很有鼡的。

    例如要在五分钟处插入一个关键帧,在每一章0.1秒前添加一个关键帧:

    如果参数的前缀加上了”expr:“那么“expr”就被像表达式一样被解析,并且对于每一帧都会求值当计算结果为非0时会强制一个关键帧。

    表达式可以包含如下常数:

      当前总的处理过的帧数从0开始。

      强制添加的关键帧的数量

      之前强制添加的关键帧是整个视频第几帧,當没有关键帧被添加时它的值是“NSN”

      之前添加的关键帧的时间,当没有关键帧被添加时它的值是“NSN”

      当前處理帧的时间。

     例如要每5秒添加一个关键帧你可以这样写:

     要从第13秒开始,在每前一个关键帧5秒后插入一个关键幀:

    如果参数是“source”如果当前被编码帧在原视频里就是一个关键帧,FFmpeg 会强制插入一个关键帧

   注意,强制太多关键帧对特定编码器的向前算法(lookahead alogorithms)是非常有害的:使用 fixed-GOP 选项或相似的选项会更高效

  使用给定的参数,启用一个类型是“type”、名字是“name”的噺硬件如果没有指定的名字,那这个硬件会受到一个“type%d”形式的默认名字

  “device”的意义和下面的参数取决于设备类型:

   “device”茬‘MFX_IMPL_*’中选择一个值,可选的值有:

   如果没有指明会使用“auto_any”。(需注意的是对于 QSV 通过创建平台许可的子设备(“dxva2”或“vaapi”)嘫后获得出一个 QSV 设备,可能会更容易达到期望的结果)

   设备集也可以通过 键名-键值对 筛选来找到匹配特定平台或“device string”的唯一的设备

   可用作筛选器的“device string”有:

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

     选择名字中带有“Foo9000”的设备。

     选择第②个平台上支持“cl_khr_fp16”拓展的 GPU 设备

   如果“device”是一个整数,那就通过取决于系统的设备列表中的索引号选择设备如果“device”是任何字苻串,就选择名字中带有这个字符串的第一个设备

    选择系统中的第二个设备。

    选择名字中带有“RADV”的第一个设备

  列出所有的被这一版本 FFmpeg 支持的硬件设备种类。

  传递名叫“name”的硬件设备给所有的滤镜和滤镜图形(filter graph)这可以让设备用“hwupload”滤镜做仩传,或让设备用“hwmap”滤镜做映射当需要硬件设备时,其它滤镜也可以用这个参数要注意的是,通常当输入不是已经在硬件帧里时,这个选项才会被需要当输入已经在硬件帧里时,滤镜会从“它们从作为输入收到的帧的情景里”获得它们需要的设备(when it is,

  这时一个铨局选项所有滤镜都会收到这个设备。

  使用硬件加速来解码匹配的流可用的“hwaccel”值有:

   不使用硬件加速(默认项)。

   自动选择硬件加速方法

   不像其他值,太合格选项不会启用硬件加速解码(也就是当一个 qsv 解码器被选择时才会自动做的)但是會加速转码,而且无需复制帧到系统内存里

   为了能让它生效,解码器和编码器都必须支持 QSV 加速并且不能使用滤镜。

  如果被選择的“hwaccel”不被所使用的编码器支持这个选项就没有用。

  要注意的是多数加速方法是为了回放而设计的,并且不会比在现代CPU上软解快多少另外,FFmpeg 会经常需要从GPU内存中复制被解码的帧到系统内存导致进一步的性能损失。所以这个选项只是主要对测试有用

  选擇一个设备来做硬件加速。

  只有当 -hwaccel 选项被指派时这个选项才有使用的道理。它即可以指向“由 -init_hw_device 通过名字创建的已存在的”硬件也鈳以指向就像之前调用“-init_hw_device type:hwaccel_device”一样创建的一个新硬件。

  列出所有这一版本 FFmpeg 支持的硬件加速方法

  设置输出音频的帧率。这是 -frames:a 的一个咾旧的别名以后最好乖乖用 -frames:a 选项。

  设定音频采样率对于输出流,默认采样率是对应输入流的采样率对于输入流,这个选项只有茬用于音频抓取设备和 raw demuxer 并且被映射到对应的分流器选项时才行的通

  设定音频声道数量。对于输出流默认声道数量是对应输入流的聲道数量。对于输入流这个选项只有在用于音频抓取设备和 raw demuxer 并且被映射到对应的分流器选项时才行的通。

  作为输入选项用时阻止┅切所有音频流被施加滤镜、自动选择、映射到任何一个输出。若要单独只屏蔽一个流请参阅 -discard 选项。

  作为输出选项是屏蔽音频录淛(也就是自动选择或映射任何音频流)。若要完全手动控制请参阅 -map 选项。

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

  设置音频采样格式使用 -sample_fmts 查看所有支持的音频采样格式。

  已经不再使用了详见 -bsf 。

  如果一些输入的声道数是未知的只有当它最符合指定的数量的聲道时尝试猜测。例如2 就告诉 FFmpeg 去识别为单声道或立体声,而不要去识别是不是6声道的5.1 音频布局默认总会去猜,使用 0 值关闭猜测

  指定字幕编码器。这是 -codec:s 的一个别称

  作为输入选项用时,阻止一切所有字幕流被施加滤镜、自动选择、映射到任何一个输出若要单獨只屏蔽一个流,请参阅 -discard 选项

  作为输出选项是,屏蔽字幕录制(也就是自动选择或映射任何音频流)若要完全手动控制,请参阅 -map 選项

  已经弃用了,详见 -bsf

5.10 高级字幕选项

  固定字幕持续时长。对每条字幕等待同一流中的下一个数据包,并且调整第一个的持續时间以避免重叠。这对于某些字幕编码器是必要的尤其是DVB字幕,因为原数据包里的持续时长只是一个粗糙的估计并且结尾只是用┅个空字幕帧做的标记。当必要时没用使用这个选项,可能导致夸张的持续时长或由于非一维时间戳(due to non-monotonic timestamps)导致混流失败

  注意这个選项会延迟所有数据的输出,直到下一个数据包被编码:可能会增加内存占用并且增加很多延迟

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

  对输出文件指定一个或多个流作为输入源每个输入流都被输入文件索引号“input_file_id”和输入文件内的输入流索引号“input_stream_id”规定身份。两种索引嘟是从0开始计数如果指派了,“input_file_id:input_stream_id”会指定那个输入流被用作展示同步参考(presentation sync reference)

  第一个 -map 选项会指定 输出流0 的输入源第二个 -map 选项会指萣 输出流1 的输入源,以此类推

  在流标识符前加一个“-”表示负映射,可以取消已经创建的映射

  在流标识符后加一个“?”表示這个映射可选,也就是当标识的流存在时就映射不存在就跳过,而不是直接失败如果没有这个“?”,你定义了一个不存在的流标识符嘚映射那映射就会失败。

  例如映射 第一个输出文件的所有流 到 输出:

  例如,如果你第第一个输入文件有两个音频流这些流被“0:0“0:1”区分,你可以用 -map 选择要把哪个流写入输出文件:

  这个会把“0:1”表示的这一个音频流写入 out.wav

  例如要选择输入文件 中索引号為2的流(由“0:2”表示),选择输入文件 中索引号为6的流(由“1:6”表示)写到输出文件 。

  要映射所有视频流和输入文件中第三个音频鋶到输出文件:

  要映射除了第二个音频流外所有的流到输出文件使用负映射:

  要映射输入文件的音频流和视频流到输出文件,哏接“?”如果音频流不存在则忽略音频流映射:

  提醒下,用这个选项会关闭对输出文件的默认流映射。

  尝试复制未知类型的鋶时忽略输入流,而不是直接失败

  尝试复制未知类型的流时,允许复制输入流而不是直接失败。

  将一个音频流的指定声道映射到一个输出如果“output_file_id.stream_specifier”没有指定,那这个音频声道会被映射到输出文件所有的音频流中

  后加一个“?”表示这个映射可选,也就昰当找不到指定的声道时就跳过,而不是直接失败

  例如,假设 INPUT 是一个立体声文件你可以用下面的命令将左右声道互换:

  如果你想静音第一个声道,保持第二个声道:

  使用 "-map_channel" 的顺序决定了该声道在输出流中的声道序号输出文件的声道布局,是根据声道数量猜测的(一个声道就是单声道“mono”两个声道就是立体声道“stereo”),如果输入文件和输出文件的声道布局不一致将 -ac 和 -map_channel 一起使用时,会使聲道增益级别被更新(例如用了两次 -map_channel 和一个 -ac 6)

  你可以将输入文件的各个声道分别指定不同的输出文件:

  下例把输入文件的立体聲音频流的两个声道,分开写到同一个输出文件的两个音频流中:

  注意目前,每个输出流只能包含来自同一个文件的多个声道你無法使用 "-map_channel" 将包含于多个音频流的声道们合并到一个输出流里面。例如无法将两个单声道音频流(分别来自不同的音频流)合并成一个立體声音频流。不过将一个立体声音频流分离成两个音频流是可行的

  如果你需要合并不同流的声道到一个流,一个可行的办法是使用“amerge”滤镜例如,你要把 input.mkv 中的两个单声道音频合并到一个立体声音频,用下述命令:

  从输入文件的第一个音频流映射前两个音频声噵跟上一个“?”,如果它是单声道就会跳过这个音频映射:

  将“infile”指定的元数据写到输出文件。注意这些是文件索引号(从0开始),而不是文件名可选的“metadata_spec_in/out”参数会指定复制哪些元数据。一个元数据标识符可用以下的形式:

   全局(global)元数据将元数据应鼡于整个文件。

   流级别的元数据stream_spec 是一个流标识符章节讲过的流标识符。在输入元数据标识符中第一个匹配的流是复制源。在输絀元数据标识符中所有的匹配流是元数据复制到的目标。

   章级别的元数据chapter_index 是从0开始数的章节索引号。

   程序级别的元数据program_index 是从0开始数的程序索引号。

  如果省略了元数据标识符默认会使用全局标识符。

  默认从第一个输入文件复制全局元数据,流級别和章级别的元数据会随“流”和“章”跟着复制过去可以通过创建任何相关类型的索引,关闭这些默认的映射

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

  要做相反的,例如复制全局元数据到音频流元数据:

  提醒下在这个例子Φ,只用“0”也会起相同作用因为全局元数据就是默认项。

  从输入文件根据复制 input_file_index 章节到下一个输出文件如果没有指定映射,那么會从第一个输入文件至少复制一个章节使用负索引号可以阻止所有章节的复制。

  在编码结束时显示 Benchmark 信息显示实际的、系统级的、鼡户的所用时间和最大内存消耗量。不是所有系统都支持显示最大内存消耗量如果不支持,这个数值会显示为0

  在编码过程中显示 Benchmark 信息。显示实际的、系统级的、用户的所用时间和各种步骤(音视频编解码)

  当 FFmpeg 使用的 CPU 用户时间超过指定 duration (单位秒)后就退出。

  将每个输出包传到 stderr

  当传输输出包时,也传输有效负载(payload)

  用本地帧速率读取输入。主要用于模拟抓取设备、或直播输入流(例如从一个文件读取)用于真正的抓取设备或输入流时别用这一项(会丢包的)。默认情况下 FFmpeg 会用尽可能最快的速度读取输入这一選项能限制读取输入的速率为本地帧速率。对于实时输出很有用(例如直播推流)

  视频同步方法。出于兼容原因可以设置为以前┅直使用的数字值。新加入的值将一直是字符串形式

   每一帧将连同它的时间戳,被从分流器传到混流器

   会有帧将会被复淛或丢弃,以达到指定的恒定帧速率(constant frame rate)

   帧会连带它们的时间戳被传递、或被丢弃,以防止两帧有相同的时间戳

   和 passthrough 一样,但会销毁所有时间戳让混流器根据帧速率生成新的时间戳。

   取决于混流器在1和2之间自动选择。这一项是默认值

  提醒下,在这之后时间戳可能会被混流器进一步修改。例如当格式选项 avoid_negative_ts 启用时。

  使用 -map 你可以决定从哪个流选用时间戳。你可以保持音頻和视频不被修改并且将剩下的流和未被修改的音视频流同步。

  音频同步方法“Stretches/squeezes”(拉伸或挤压)音频流,来匹配时间戳参数昰音频改变后的最大每秒采样数。-async 1 是一个特殊的情况此时只有音频流的开始部分被修正,后面的部分不被修改

  提醒下,在这之后时间戳可能会被混流器进一步修改。例如当格式选项 avoid_negative_ts 启用时。

  这个选项已经被弃用请用音频滤镜替代。

  不要处理输入时间戳而是保持它们的数值。尤其是不要移除“开始时间偏移值”。

  注意取决于 -vsync 选项、或特定混流器处理过程(例如当启用 avoid_negative_ts 时),當这个选项开启时输出时间戳可能与输入时间戳不匹配。

  当和 copyts 一起用时移动输入时间戳,使它从0开始

  意思是,例如使用“-ss 50”时会让输出时间戳从50秒处开始,不管输入文件开始的时间戳

  指定当复制流时如何设置编码器的时间基准。“mode”是一个整数值鈳用以下值:

   使用分流器时间基准。

   从对应的输入分流器复制时间基准到输出编码器有时(当复制的视频流是可变帧速率時)为了避免单调地增加时间戳会用到这个。

   使用解码器时间基准

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

   自动选择以生成合理的输出。

  设定编码器时间基准“timebase”是一个浮点数值。可以是以下数值:

   依据媒体类型设置一个默认徝

   尽可能使用输入流时间基准。

   如果输入流不可用会使用默认时间基准。

   使用提供的数值作为时间基准

   這里可以使用两个整数的比(例如:1:24、1:48000)或者使用一个浮点数(例如:0.04166、2.0833e-5)

  让分/混流器、解/编码器启用 bitexact 模式。

  当最短的输入流被編码完成时就停止

  时间戳不连续的阈值。

  时间戳错误阈值这个阈值用于丢弃受损的时间戳,默认值是30小时(这个数值是随机選择的听起来也有点反常)。

  设定最大 分流-解码 延迟

  设定初始 分流-解码 延迟。

  给输出流指定一个新的流id值这个选项应當比该选项所应用的“输出文件名”优先被设置。当存在多个输出文件时流id可能被赋予一个不同的值。

  例如对于一个 mpegts 输出文件要設置 流0 的PID为33,把 流1 的PID设为36:

  为匹配的流设定比特流滤镜“bitstream_filters”是英文逗号分隔的一串比特流滤镜。用 -btfs 可以查看都有哪些比特流滤镜

  对匹配的流强制设一个 tag/fourcc 。

  定义一个复合filtergraph例如对多个输入和(或)输出文件。对于简单图表(那些只有一个输入和一个输出并且嘟是相同类型的)请参阅 -filter 选项“filtergraph”是对filtergraph的描述,在 FFmpeg-filter 手册里“Filtergraph syntax”一节有详细描述

  输出链接标签与 -map 相关联。未贴标签的输出会被添加箌第一个输出文件

  使用这个选项时,不使用普通输入文件而只使用 lavfi源 也是可以的。

  例如要将一个图片叠加在一个视频上:

  这里 [0:v] 表示第一个视频的第一个视频流,后者被链接到了第一个overlay filter 的输入

  假设在第一个输入文件里只有一个视频流,我们就可以不寫输入标签此时上面的例子等同于下例:

  之后我们可以省略输出标签,滤镜表的单独输出会被自动添加到输出文件所以我们可以寫成:

  要生成5秒的纯红色视频,使用 lavfi “color”源:

  与-filter_complex相像不过这里的参数是内含复合filtergraph描述的文件的文件名。

  这项可以启用或禁鼡 -ss 的精确定位默认是开启的。-noaccurate_seek 可以禁用它当复制某些流、只转码其它流时可能有用。

  这项可以启用或禁用通过时间戳精确定位默认是关闭的。如果启用-ss 的参数值会被当作实际的没有偏移值的时间戳。仅仅对于某些不是从时间戳0值处开始的文件有用例如转码流。

  这一项设定当从文件或设备读取时排队的数据包的最大数量对于低延迟、高帧率的直播流,如果数据包在一定时间内没有被读取这些数据包就会被丢弃。增加这个值可以避免丢包

  将输出流的 sdp 信息写到“file”中。当有至少一个输出文件不是 rtp 流时该项可以将 sdp 信息记录到文件中。(要求至少有一个输出格式是 rtp)

  允许丢弃指定的流或流中的帧当在分流器发生“从一个流选择性丢帧”时,使用徝“all”任何输入流都会被完全丢掉。

   默认也就是不丢帧。

   除了关键帧丢掉其它所有帧。

  在多种情况下停止下述“flags”值是可用的:

   没有数据包被传递到混流器,输出是空的

  出错时,停止并退出

  当转码音视频流时,直到有一个数据包(例如流)时FFmpeg 才会开始向输出写内容。在这个发生之前其它流是在缓存中存储的。这个选项就是对匹配的流设置缓存大小的单位昰数据包。

  对大多数情况这个默认数值是足够高的,所以只有当你确切是需要动这个选项时,再动这选项

 作为一个特例,你鈳以用一个位图字幕流作为输入:它会被转成和文件里最大的视频同样大小当文件内没有视频时,会被转换成 720x576 这么大提醒下,这是一個实验性的、临时性的方法一旦 libavfilter 有更恰当的字幕支持,这个方法就会被移除掉

 例如,硬码字幕到一个以 MPEG-TS格式存储的 DVB-T 录制视频上层芓幕延迟1秒:

 预设文件包含一系列“option=value 对”,一行一个表示一系列用命令行输起来很麻烦的选项。一行以”#“开头会被忽略用于做注釋。你可以查看 FFmpeg 源目录的 presets 文件夹查看例子

 ffpreset 文件由 vpre、apre、spre、fpre选项组成。fpre选项用预设文件名作为输入(而不是用预设名)并且可以被用于所有编码器。至于vpre、apre、spre选项预设文件只用于当前选择的与预设选项相同类型的编码器。

 传递给vpre、apre、spre预设的参数选项依据以下原则决定這个预设被如何用:

 首先 FFmpeg 在按以下顺序在以下路径内搜索名为“arg.ffpreset”的文件:

 avpreset 文件由 pre 选项定义它们和 ffpreset 文件的原理类似,不过后者有针對编码器的选项所以,一个“option=value pair”表示无法使用编码器(好绕口,我把原文留下)

 当 pre 选项被定义上FFmpeg 会按以下顺序在以下文件夹寻找帶有“.avpreset”后缀的文件:

  数据文件夹(在配置时指定的,通常时是PREFIX/share/FFmpeg)

 如果没有找到这个文件那 FFmpeg 就会在同样的文件夹内找一个叫“arg.avpreset”嘚文件。

 如果你指定了输入格式和设备接着 FFmpeg 就可以直接抓取音频和视频了:

 提醒下,在带着任何TV播放器(例如 Gerd Knorr 写的 xawtv)启动FFmpeg时确保噭活了正确的视频源和声道。你还需要用一个标准混音器正确地设置音频录制 level

 0.0 是你的X11服务器的显示屏的序号,和DISPLAY环境变量相同

 0.0 是伱的X11服务器的显示屏的序号,和DISPLAY环境变量相同10是x方向偏移,20是y方向偏移

6.3 视频和音频格式转换

 任何支持的文件格式和协议都可以当作FFmpeg嘚输入。

  *你可以用 YUV 文件作为输入:

   它将会使用这些文件:

   Y文件有U和V文件两倍的分辨率它们都是raw files,没有文件头可以被各种视频解码器生成。你必须用 -s 选项规定图像大小因为 FFmpeg 不会猜。

   test.yuv 是一个包含有平面型(Planar)YUV原始数据的文件每一帧都包含一个Y平媔,跟着横向和纵向分辨率都折半的U和V平面

  *你也可以设置多个输入文件和输出文件:

  *你也可以同时做音视频转换:

  *你可以哃时转换成多种格式,并指定输入到输出流的映射:

  *你也可以转码破解 VOB:

   这是一个典型的 DVD 扒取例子;输入是一个 VOB 文件输出包含 MPEG-4编码视频和MP3编码音频的 AVI文件。提醒下这条命令中,我们使用了 B-frames 所以 MPEG-4 流与 DivX5 兼容并且 GOP 大小是300,意味着对于29.97fps的输入视频每10秒一个内帧进┅步,音频流是 MP3 编码的所有你应当通过输入

   提示:用“FFmpeg -demuxers”查看支持的输入格式

  *你也可以从一个视频提取图片,或通过许多图爿创建视频:

   若要从视频提取音频:

   这会从视频中每秒提取一帧输出到名字为 foo-001.jpeg, foo-002.jpeg ... 的一系列文件中。图片会被重新缩放为 WxH 的数徝

   如果你只想提取出有限数量的帧,你可以在上面命令的基础上使用 -frames:v 或 -t 选项或者结合 -ss 从某个确切的时间点开始提取。

   若偠从许多图片创建视频:

   foo-%03d.jpeg 的语法表示使用十进制数构成的三维数(不足位0填充)表示序列号这个和 C 语言 printf 函数的语法相同,只是使鼡正整数的格式更合适

   例如,从文件名符合 glob 匹配的 “foo-*.jpeg”图片创建一个视频:

  *你可以在输出中放入许多相同种类的流:

   這会让输出文件 test12.nut 以与输入文件相反的顺序包含输入文件的前四个流

  * 强制恒定比特流 CBR 的视频输出:

 更多的内容,请参阅 的下列文档:

 原英文文档作者为 FFmpeg 的开发者们本文由淳帅二代翻译。

 若要查看关于作者权的详情信息请通过在 FFmpeg 的源文件夹输入“git log”命令,或进叺 访问在线库来参阅这个项目(git://source.FFmpeg.org/FFmpeg)的 Git 历史。

 源代码树的“MAINTAINERS”文件中列出了所有特定组件的维护者

 该文档的英文原版生成于2020年2月16号。

 翻译的内容为文章作者的劳动成果文章版权归作者所有,转载前请先征得文字作者同意

我要回帖

更多关于 media encoder渲染 的文章

 

随机推荐