ffmpeg文档翻译(一)

ffmpeg文档翻译(一)

还在学习ffmpeg,顺便翻译一下文档,方便以后回顾。

ffmpeg是一种非常快速的视频和音频转换器,也可以从实时音频/视频源中获取。 它还可以在任意采样率之间转换,并使用高质量的多相滤波器即时调整视频大小。

ffmpeg使用-i选项指定任意(arbitrary)数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备(grabbing devices)等),并写入任意数量的输出“文件”,由纯输出网址(output url)指定。在命令行上找到的所有不能解释为选项的内容都被视为输出URL。

每个输入或输出URL原则上可以包含任意数量的不同类型的流(视频/音频/字幕/附件/数据)。流的允许数量和/或类型可能会受到容器格式的限制。自动或使用-map选项指定要从哪个输入流和指定进入哪个输出。

要在选项中引用输入文件,必须使用它们的索引(从0开始)。例如,第一个输入文件为0,第二个输入文件为1,依此类推。类似地,文件中的流由其索引引用。例如: 2:3引用第三输入文件中的第四流。

通常,选项将应用于下一个指定的文件。因此,顺序很重要,可以在命令行上多次使用相同的选项。然后,将每次出现都应用于下一个输入或输出文件。全局选项例外(例如,详细级别),应首先指定。

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

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

ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi

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

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

设置输入文件的帧率为1 fps ,输出文件的帧率为24fps

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

-r 设置帧率

ffmpeg流程详细说明
转换流程

ffmpeg调用libavformat库(包含解复用器)以读取输入文件并从中获取包含编码数据的数据包。 当有多个输入文件时,ffmpeg尝试通过跟踪任何活动输入流上的最低时间戳来使它们保持同步。然后,已编码的数据包将传递到解码器(除非选择了流复制)。 解码器产生未压缩的帧(原始视频/ PCM音频/ …),可以通过过滤进一步处理。 过滤后,将帧传递到编码器,编码器对其进行编码并输出编码后的数据包。 最终,这些被传递到复用器,该复用器将编码的数据包写入输出文件。

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

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

请注意,某些过滤器会更改框架属性,但不会更改框架内容。 例如,上例中的fps过滤器会更改帧数,但不会触及帧内容。 另一个示例是setpts过滤器,该过滤器仅设置时间戳,否则不传递帧。
复杂的过滤器
复杂的滤镜

复杂的过滤器图是使用-filter_complex选项配置的。 请注意,此选项是全局的,因为复杂的过滤器从本质上讲不能与单个流或文件明确关联。-lavfi选项等效于-filter_complex。
复杂过滤器图的一个简单示例是覆盖过滤器,它具有两个视频输入和一个视频输出,其中一个视频叠加在另一个视频之上。 其音频对应物是混合滤波器。

流复制 Stream copy
流复制是通过将复制参数提供给-codec选项来选择的模式。 它使ffmpeg省略了指定流的解码和编码步骤,因此仅进行解复用和复用。 这对于更改容器格式或修改容器级别的元数据很有用。 在这种情况下,上图将简化为:
流复制

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

流选择 Stream selection
ffmpeg提供了-map选项,用于手动控制每个输出文件中的流选择。 用户可以跳过-map并让ffmpeg如下所述执行自动流选择。
-vn / -an / -sn / -dn选项可以用来分别跳过视频,音频,字幕和数据流的包含,无论是手动映射还是自动选择,这些流是复杂过滤图的输出。
尽管已尽一切努力来准确反映程序的行为,但FFmpeg仍在不断开发中,并且自撰写本文以来,代码可能已更改。

Automatic stream selection
如果没有针对特定输出文件的任何映射选项,则ffmpeg将检查输出格式,以检查可以在其中包含哪种类型的流。 视频,音频和/或字幕。 对于每种可接受的流类型,ffmpeg将从所有输入中选择一个流(如果可用)。

它将根据以下条件选择该流:
对于视频,它是最高分辨率的视频流,
对于音频,它是频道最多的流,
对于字幕,这是找到的第一个字幕流,但有一个警告。 输出格式的默认字幕编码器可以基于文本,也可以基于图像,并且只会选择相同类型的字幕流。

在几个相同类型的流均等地分配的情况下,选择索引最低的流。
数据或附件流不会自动选择,只能使用-map指定包含。

如果有任何带有未标记 pad 的复杂filtergraph输出流,它们将被添加到第一个输出文件。 如果输出格式不支持流类型,则将导致致命错误。 在没有map选项的情况下,这些流的包含会导致跳过其类型的自动流选择。 如果存在映射选项,则除了映射的流之外,还包括这些过滤器图流。
带有标记pad 的复杂filtergraph输出流必须映射一次且恰好映射一次。

实例

下面有3个输入文件,演示ffmpeg的流选择方法的行为,奇特的行为和局限性。

input file ‘A.avi’
stream 0: video 640x360
stream 1: audio 2 channels

input file ‘B.mp4’
stream 0: video 1920x1080
stream 1: audio 2 channels
stream 2: subtitles (text)
stream 3: audio 5.1 channels
stream 4: subtitles (text)

input file ‘C.mkv’
stream 0: video 1280x720
stream 1: audio 2 channels
stream 2: subtitles (image)

Example: automatic stream selection

ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov

指定了三个输出文件out1.mkv out2.wav out3.mov,对于前两个文件out1.mkv out2.wav,未设置-map选项,因此ffm​​peg将自动为这两个文件选择流。
out1.mkv是Matroska容器文件,接受视频,音频和字幕流,因此ffm​​peg将尝试自动选择。
对于视频,它将从B.mp4中选择流0,该流在所有输入视频流中具有最高的分辨率。
对于音频,它将从B.mp4中选择流3,因为它具有最大数量的通道。
对于字幕,它将从B.mp4中选择流2,这是A.avi和B.mp4中的第一个字幕流。
out2.wav仅接受音频流,因此仅选择了B.mp4中的流3。
对于out3.mov,由于设置了-map选项,因此不会发生自动流选择。 -map 1:a选项将从第二个输入B.mp4中选择所有音频流。此输出文件中将不包含其他流。
对于前两个输出,所有包含的流都将被转码。所选的编码器将是每种输出格式注册的默认编码器,可能与所选输入流的编解码器不匹配。
对于第三个输出,音频流的编解码器选项已设置为复制,因此不会发生解码-过滤-编码操作。所选流的数据包应从输入文件传送并在输出文件中多路复用。

Example: automatic subtitles selection

ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt

此处使用-filter_complex选项设置过滤器,该过滤器由单个视频过滤器组成。 覆盖过滤器恰好需要两个视频输入,但没有指定任何视频输入,因此使用前两个可用的视频流,即A.avi和C.mkv。 过滤器的输出面板没有标签,因此被发送到第一个输出文件out1.mp4。 因此,跳过了视频流的自动选择,这将在B.mp4中选择该流。 具有大多数频道的音频流,即。 B.mp4中的流3是自动选择的。 但是,由于MP4格式没有注册默认的字幕编码器,并且用户尚未指定字幕编码器,因此未选择字幕流。第二个输出文件out2.srt仅接受基于文本的字幕流。 因此,即使第一个可用的字幕流属于C.mkv,它也是基于图像的,因此被跳过。 所选的流(B.mp4中的流2)是第一个基于文本的字幕流。

Example: unlabeled filtergraph outputs

ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt

此处使用-filter_complex选项设置过滤器图,该过滤器图由单个视频过滤器组成。 覆盖过滤器恰好需要两个视频输入,但没有指定任何视频输入,因此使用前两个可用的视频流,即A.avi和C.mkv。 过滤器的输出面板没有标签,因此被发送到第一个输出文件out1.mp4。 因此,跳过了视频流的自动选择,这将在B.mp4中选择该流。 具有大多数频道的音频流,即。 B.mp4中的流3是自动选择的。 但是,由于MP4格式没有注册默认的字幕编码器,并且用户尚未指定字幕编码器,因此未选择字幕流。
第二个输出文件out2.srt仅接受基于文本的字幕流。 因此,即使第一个可用的字幕流属于C.mkv,它也是基于图像的,因此被跳过。 所选的流(B.mp4中的流2)是第一个基于文本的字幕流。

Example: labeled filtergraph outputs 示例:带标签的过滤器输出

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \
-map '[outv1]' -an        out1.mp4 \
                          out2.mkv \
-map '[outv2]' -map 1:a:0 out3.mkv

来自B.mp4的视频流被发送到色相(hub)过滤器,该色相(hub)过滤器的输出使用拆分(split)过滤器被克隆一次,并且两个输出都被标记。然后每个副本都映射到第一 输出文件out1.mp4 和第三输出文件out3.mkv。
需要两个视频输入的覆盖(overlay)滤波器使用前两个未使用的视频流。这些是来自A.avi和C.mkv的流。叠加层输出未标记,因此无论-map选项是否存在,它都会发送到第一个输出文件out1.mp4。
向aresample过滤器发送第一个未使用的音频流A.avi。由于此过滤器输出也未标记,因此它也映射到第一个输出文件。 -an的存在仅抑制音频流的自动或手动流选择,而不抑制从过滤器图表发送的输出。这两个映射流都应在out1.mp4中的映射流之前排序。映射到out2.mkv的视频,音频和字幕流完全由自动流选择确定。out3.mkv由色相(hub)过滤器的克隆视频输出和B.mp4的第一个音频流组成(1:a:0)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值