ffmpeg的学习-00

  1. 命令行 大体样式
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

有道翻译的 以后仔细回看
2.描述
ffmpeg是一个非常快的视频和音频转换器,也可以从一个实时音频/视频源抓取。它还可以转换之间的任意采样率和调整大小的视频在飞行与高品质多相滤波器。
ffmpeg读取由-i选项指定的任意数量的输入“文件”(可以是常规文件、管道、网络流、抓取设备等),并写入由普通输出url指定的任意数量的输出“文件”。在命令行中发现的任何不能解释为选项的内容都被认为是输出url。
原则上,每个输入或输出url可以包含任意数量的不同类型的流(视频/音频/字幕/附件/数据)。允许的流的数量和/或类型可能受到容器格式的限制。选择哪个输入流将自动进入哪个输出流,或者使用-map选项(请参阅流选择章节)。
要引用选项中的输入文件,必须使用它们的索引(基于0)。例如,第一个输入文件是0,第二个是1,等等。类似地,文件中的流也由它们的索引引用。2:3是指第三个输入文件中的第四个流。还请参阅流说明符一章。
通常,选项应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。然后,将每个事件应用到下一个输入或输出文件。这个规则的例外是全局选项(例如冗长级别),应该首先指定它。
不要混合输入和输出文件-首先指定所有输入文件,然后指定所有输出文件。也不要混合属于不同文件的选项。所有选项只适用于下一个输入或输出文件,并在文件之间重置。
To set the video bitrate of the output file to 64 kbit/s:
将输出文件的视频比特率设置为64 kbit/s:

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

To force the frame rate of the output file to 24 fps:
强制输出文件帧率为24帧/秒:

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

To force the frame rate of the input file (valid for raw formats only) to 1 fps and the frame rate of the output file to 24 fps:
强制输入文件的帧速率(只适用于原始格式)为1帧,输出文件的帧速率为24帧:

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

???只适用于原始格式 不理解???
对于原始输入文件,可能需要format选项。
3.详细描述
ffmpeg中每个输出的转码过程如下图所示:

 _______              ______________
|       |            |              |
| input |  demuxer   | encoded data |   decoder
| file  | ---------> | packets      | -----+
|_______|            |______________|      |
                                           v
                                       _________
                                      |         |
                                      | decoded |
                                      | frames  |
                                      |_________|
 ________             ______________       |
|        |           |              |      |
| output | <-------- | encoded data | <----+
| file   |   muxer   | packets      |   encoder
|________|           |______________|

???decoded frames 这里不明白???

ffmpeg调用libavformat库(包含demuxers)来读取输入文件并从其中获取包含编码数据的包。当有多个输入文件时,ffmpeg试图通过跟踪任何活动输入流上的最低时间戳来保持它们的同步。
???最低时间戳 什么概念 是不是最后的????
然后将经过编码的包传递给解码器(除非为流选择streamcopy,否则请参阅进一步的描述)。解码器产生未压缩的帧(原始视频/PCM音频/…),可以通过过滤进一步处理(参见下一节)。过滤后,帧被传递给编码器,编码器对帧进行编码并输出编码后的数据包。最后,它们被传递给muxer, muxer将经过编码的包写入输出文件。
3.1过滤
在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。几个链接过滤器形成一个过滤器图。ffmpeg区分了两种过滤图:简单过滤图和复杂过滤图。
3.1.1 简单过滤器图
简单的过滤器图是那些只有一个输入和输出的过滤器,它们都属于同一类型。在上图中,只要在解码和编码之间插入一个额外的步骤,就可以表示为:

|         |                      |              |
| decoded |                      | encoded data |
| frames  |\                   _ | packets      |
|_________| \                  /||______________|
             \   __________   /
  simple     _\||          | /  encoder
  filtergraph   | filtered |/
                | frames   |
                |__________|

简单的过滤器图配置为每流过滤器选项per-stream -filter option (分别为视频和音频配置-vf和-af别名)。一个简单的视频过滤图可以像这样:

 _______        _____________        _______        ________
|       |      |             |      |       |      |        |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______|      |_____________|      |_______|      |________|

注意,有些过滤器改变帧属性,但不改变帧内容。例如,上面例子中的fps过滤器会改变帧数,但不会触及帧内容。另一个例子是setpts过滤器,它只设置时间戳,并以其他方式不变地传递帧。
3.1.2 复杂过滤器图
复杂的过滤图不能简单地描述为应用于一个流的线性处理链。例如,当图形有多个输入和/或输出时,或者当输出流类型与输入不同时,就会出现这种情况。它们可以用下图表示:

 _________
|         |
| input 0 |\                    __________
|_________| \                  |          |
             \   _________    /| output 0 |
              \ |         |  / |__________|
 _________     \| complex | /
|         |     |         |/
| input 1 |---->| filter  |\
|_________|     |         | \   __________
               /| graph   |  \ |          |
              / |         |   \| output 1 |
 _________   /  |_________|    |__________|
|         | /
| input 2 |/
|_________|

复杂过滤器图配置为-filter_complex选项。注意,这个选项是全局的,因为复杂的过滤器图本质上不能与单个流或文件明确关联。
-lavfi选项相当于-filter_complex。
复杂过滤图的一个简单示例是overlay filter,它有两个视频输入和一个视频输出,其中一个视频覆盖在另一个之上。它的音频对应项是amix过滤器。
3.2 Stream copy
流复制是通过向-codec选项提供复制参数来选择的模式。它使ffmpeg省略了指定流的解码和编码步骤,因此它只进行解复用和muxing。它对于更改容器格式或修改容器级元数据非常有用。在这种情况下,上面的图表将简化为:

 _______              ______________            ________
|       |            |              |          |        |
| input |  demuxer   | encoded data |  muxer   | output |
| file  | ---------> | packets      | -------> | file   |
|_______|            |______________|          |________|

由于没有解码或编码,它是非常快的,没有质量损失。然而,由于许多因素,它可能在某些情况下不起作用。应用过滤器显然也是不可能的,因为过滤器处理未压缩的数据。
4. Stream selection
ffmpeg为手动控制每个输出文件中的流选择提供了-map选项。用户可以跳过映射,并让ffmpeg执行如下所述的自动流选择。可以使用-vn / -an / -sn / -dn选项分别跳过视频、音频、字幕和数据流的包含,无论是手动映射还是自动选择,但那些流是复杂过滤图的输出。
4.1 描述
下面的子部分描述了在流选择中涉及的各种规则。下面的示例将展示如何在实践中应用这些规则。
虽然已经尽了一切努力来准确地反映程序的行为,但是FFmpeg还在不断地开发中,而且代码可能在编写本文时就已经更改了。
4.1.1 Automatic stream selection
在没有特定输出文件的任何映射选项的情况下,ffmpeg检查输出格式,以检查可以包含哪种类型的流,即视频、音频和/或字幕。对于每个可接受的流类型,ffmpeg将在所有输入中选择一个可用的流。
它将根据以下标准选择该流:
对于视频,它是分辨率最高的流,
对于音频,它是拥有最多频道的流,
对于字幕,这是第一个字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本的,也可以是基于图像的,并且只选择相同类型的字幕流。
在相同类型速率的多个流相同的情况下,选择索引最低的流。
数据或附件流不会自动选择,只能使用-map包含。
4.1.2 Manual stream selection
当使用-map时,该输出文件中只包含用户映射的流,下面描述的filtergraph输出可能有一个例外。
4.1.3 Complex filtergraphs

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值