- libavcodec:提供了一系列编码器的实现。
- libavformat:实现了流协议、容器格式和基础的 IO 访问。
- libavutil:包括了哈希器、解码器和各种工具函数。
- libavfilter:提供了各种音视频过滤器。
- libavdevice:提供了访问捕获设备和回放设备的接口。
- libswresample:实现了混音和重采样。
- libswscale:实现了色彩转换和缩放功能。
- 容器/文件 Conainer/File:特定格式的多媒体文件。
- 媒体流 Stream:一种视频数据信息的传输方式,5 种流:音频,视频,字幕,附件,数据。
- 数据帧/数据包 Frame/Packet:帧代表一幅静止的图像,分为 I 帧,P 帧,B 帧。
- 编解码器 Codec:以帧为单位实现压缩数据和原始数据之间的相互转换,CODEC = COde(编码)+ DECode(解码)。
- 复用 Mux / 解复用 Demux:把不同的流按照某种容器的规则放入容器,这种行为叫做复用(Mux)。把不同的流从某种容器中解析出来,这种行为叫做解复用(Demux)。
- 帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要 15 帧。
- 码率:比特率 / 码率 / 数据率是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用
bps来表达。
按使用目的可以将 FFmpeg 命令分成以下几类:
- 基本信息查询命令
- 录制
- 分解与复用
- 处理原始数据
- 滤镜
- 切割与合并
- 视频图像互转
- 直播相关
除了 FFmpeg 的基本信息查询命令外,其它命令都按下图所示的流程处理音视频。
_______ ______________ | | | | | input | demuxer | encoded data | decoder | file | ---------> | packets | -----+ |_______| |______________| | v _________ | | | decoded | | frames | |_________| ________ ______________ | | | | | | | output | <-------- | encoded data | <----+ | file | muxer | packets | encoder |________| |______________| FFmpeg 调用 libavformat 库来读取输入文件并获取包含编码数据的数据包。 当有多个输入文件时,FFmpeg 会尝试通过跟踪任何活动输入流上的最低时间戳来使其保持同步。
然后将编码的数据包传送给解码器。 解码器产生未压缩的帧,可以通过滤波进一步处理。 在过滤之后,帧被传递到编码器,编码器并输出编码的数据包。 最后,这些传递给复用器,将编码的数据包写入输出文件。
具体命令参数详见FFmpeg 命令参数。
- 所有的数值选项中,如果不另外指明,均表示接受数值作为输入,其后可添加一个单位字符串,比如 K,M,或 G;
- 如果 i 被附加在单位,完整的前缀将被解释为一个单元前缀的二进制倍数,也即 1024 倍,而不是 1000 倍,追加 B 可使数值增加 8 倍,比如 KB,MiB,G 和 B 的数量后缀;
- 选项不带参数是布尔选项,并设置相应的值设置为
true;可以通过在选项前添加no来将选项设置为false。
默认情况下,FFmpeg 只包含输入文件中每种类型的一个流,并将其添加到每个输出文件中,FFmpeg 根据以下标准挑选每一个的最佳:
- 对于视频,是具有最高分辨率的流
- 对于音频,是具有最多 channel 的流
- 对于字幕,是第一个字幕流
- 在相同类型的几个流相等的情况下,选择具有最小索引的流
可以通过使用 -vn / -an / -sn / -dn 选项来禁用某些默认设置。 要进行全面的手动控制,可以用 -map 选项,该选项禁用刚描述的默认设置。
流标识符被用来精确地指定一个给定的选项作用于哪一个数据流。一个标识符一般是选项名称加冒号分隔的字符串。例如 -codec:a:1 ac3 包含流标识符 a:1,它匹配第二音频流。因此,将选择 AC3 编解码器的第二音频流。
一个标识符可以匹配多个流,这个选项将适用于所有流。比如,流标识符 -b:a 128k 标识了所有的音频流。
空标识符匹配所有的流。例如, -codec copy 或 -codec: copy 会复制所有的数据流而不重新编码。
流标识符的可能形式:
stream_index匹配与该索引对应的流。例如-threads:1 4将设置第二个流的线程计数为 4。stream_type[:stream_index]流类型是下列字母之一:v为视频,a为声音,s为字幕,d为数据,t为附件。如果stream_index给出,则它匹配该类型的索引为stream_index的流。否则,它匹配所有这种类型的流。- p:program_id[:stream_index] 如果给定
stream_index,那其将与在与ID为program_id的program的stream_index的流相匹配。否则,它将匹配在program_id中的所有流。 stream_id/i:stream_id按流索引逐一匹配流。m:key[:value]匹配流的元数据标签中具有指定key的流。如果value没有给出,将匹配包含给定标签的所有流。在ffmpeg中,按元数据匹配仅能用于输入文件。
ffmpeg 的封装转换功能包含在 AVFormat 模块中,通过 libavformat 库进行 Mux 和 Demux 操作;多媒体文件的格式有很多种,这些格式中的很多参数在 Mux 与 Demux 的操作参数中是公用的。
ffmpeg 编解码部分的功能主要是通过模块 AVCodec 来完成的,通过 libavcodec 库进行 Encode 与 Decode 操作。