ffmepg使用介绍

ffmepg介绍

基本语法

ffmpeg [global_options] {[input_file_options] -i input_url} … {[output_file_options] output_url} …

ffmepg的输入文件可以是多个,输出文件也可以是多个。输入文件地址用命令-i接地址指定,没有命令指定的地址是输出文件地址。
ffmpeg对选项的顺序敏感,选项作用于下一个指定的文件。所以,在一个命令中,可以出现多次相同的选项。但全局选项(global_options)必须在最前面指定。
例如,下面的命令包含两个-r,令输入文件的fps为1,输出文件的fps为24。

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

处理流程

ffmepg的处理流程可以用下图描述:
ffmepg使用介绍
这里首先说明一下多媒体数据的封装格式和编码格式。编码是对数据的压缩算法,常见的编码格式有:h264、h265、mpeg、wmv、aac 等。封装格式也称为容器格式,作为编码格式的载体,将至少一个编码格式的数据按照特定格式组织起来,并提供一些辅助功能。一个视频文件格式可以看成一个容器,这个容器包含了如音频轨道、视频轨道和其他一些元数据。常见的封装格式有mp4、mkv、avi等。

上图中demuxer是解封装器,muxer是封装器,decoder是解码器,encoder是编码器。ffmpeg首先读取输入源,然后通过demuxer将音视频包进行解封装,这个动作通过调用libavformat中的接口即可实现;接着通过decoder进行解码,将音视频通过decoder解包为YUV或者PCM这样的数据,decoder通过libavcodec中的接口即可实现;然后通过encoder将对应的数据进行编码,编码可以通过libavcodec中的接口实现;接下来将编码后的音视频数据包通过muxer进行封装,muxer封装通过libavformat中的接口即可实现,输出成为输出流。

过滤器filter

对于解码得到的原始数据,ffmpeg可以对其进行操作,并将这些操作称之为过滤。ffmpeg通过libavfilter中的接口进行过滤。
过滤分为两种,简单过滤和复杂过滤。
简单过滤如下图只有一个输入输出,可以用线性的过程来表示。
ffmepg使用介绍
复杂过滤如下图,不能用一个线性的过程来表示。
ffmepg使用介绍

参考资料

ffmpeg官方文档
https://zhuanlan.zhihu.com/p/37516093