1 概要

ffmpeg是一个非常快的视频和音频转换器。

2 描述

  • 将输出文件的视频位速率设置为 64 kbit/s:

    1
    ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
  • 将输出文件的帧速率强制为 24 fps:

    1
    ffmpeg -i input.avi -r 24 output.avi
  • 强制输入文件的帧速率(仅适用于原始格式)为 1 fps,输出文件的帧速率为 24 fps:

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

3 详细描述

每个输出中的转码过程都可以通过以下图表进行描述: ffmpeg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 _______              ______________
| | 分离器 | 编码数据包 |
| 输入 | demuxer | encoded data | decoder(解码器)
| 文件 | ---------> | packets | -----+
|_______| |______________| |
v
_________
| 解码帧 |
| decoded |
| frames |
|_________|
________ ______________ |
|输出文件| 合并器 | 编码数据包 | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder(编码器)
|________| |______________|

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

然后,编码数据包被传递到解码器(除非为流选择流的流复制,请参阅进一步的描述)。解码器生成未压缩的帧(原始视频/PCM 音频/…),可以通过过滤进一步处理(见下一节)。过滤后,帧被传递到编码器,编码器对它们进行编码并输出编码的数据包。最后,这些被传递到muxer,它将编码的数据包写入输出文件。

3.1 过滤

3.1.1 简单过滤器

简单过滤器是那些完全有一个输入和输出,都是相同的类型。再上图中,只需要在解码和编码之间插入一个额外的步骤即可以表示他们:

1
2
3
4
5
6
7
8
9
10
 _________                        ______________
| | | |
| decoded | | encoded data |
| frames |\ _ | packets |
|_________| \ /||______________|
\ __________ /
simple _\|| | / encoder
filtergraph | filtered |/
| frames |
|__________|

过滤器只改变帧属性,不改变帧内容。

3.1.2 复杂过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 _________
| |
| input 0 |\ __________
|_________| \ | |
\ _________ /| output 0 |
\ | | / |__________|
_________ \| complex | /
| | | |/
| input 1 |---->| filter |\
|_________| | | \ __________
/| graph | \ | |
/ | | \| output 1 |
_________ / |_________| |__________|
| | /
| input 2 |/
|_________|

当图形有多个输入的时候,或者输入和输出的类型不相同的时候,情况如上图所示。

复杂的过滤的一个简单的例子就是滤镜,他有两个视频输入和一个视频输出,其中的一个视频覆盖在另一个视频之上。 overlay amix

3.2 流副本