FFmpeg学习笔记
一、FFmpeg简介
1.1 FFmpeg的定义
FFmpeg既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样频率转换、多种码率转换等;FFmpeg框架提供了多种丰富的插件模块,包含封装与解封装的插件、编码与解码的插件等。
1.2 FFmpeg的基本组成方式
FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库。
- FFmpeg的封装模块——AVFormat。AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。
- FFmpeg的编解码模块——AVCodec。AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,既支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x265编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编码,则需要在AVCodec中增加相应的编解码模块。
- FFmpeg的滤镜模块——AVFilter。AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。
- FFmpeg的视频图像转换计算模块——swscale。swscale模块提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420P转换成YUYV,或者YUV转RGB等图像。
- FFmpeg的音频转换计算模块——swresample。swresample模块提供了高级别的音频重采样API。例如它允许操作音频采样、音频流通道布局转换与布局调整。
1.3 FFmpeg的编解码工具ffmpeg
ffmpeg是FFmpeg源代码编译后生成的一个可执行程序,其可以作为命令行工具使用。
例如:./ffmpeg -i input.mp4 output.avi
这是一条简单的ffmpeg命令,ffmpeg通过-i参数将input.mp4作为输入源输入,然后进行转码与转封装操作,输出到output.avi中。
ffmpeg的主要工作流程包括:解封装、解码、编码、封装。
其中需要经过六个步骤:读取输入源、进行音视频的解封装、解码每一帧音视频数据、编码每一帧音视频数据、进行音视频的重新封装、输出到目标。
1.4 FFmpeg的播放器ffplay
FFmpeg不但可以提供转码、转封装等功能,同时还提供了播放器相关功能,使用FFmpeg的avformat和avcodec,可以播放各种媒体文件或者流。如果向要使用ffplay,那么系统首先要有SDL来进行ffplay的支持。
ffplay是FFmpeg源代码编译后生成的另一个可执行程序,与ffmpeg在FFmpeg项目中充当的角色基本相同,可以作为测试工具使用,ffplay提供了音视频显示和播放相关的图像信息、音频的波形信息等。
注意:有时通过源代码编译生成ffplay不一定能够成功,因为ffplay在旧版本时依赖与SDL-1.2,而ffplay在新版本时以来于SDL-2.0,需要安装对应的SDL才能生成ffplay。
1.5 FFmpeg的多媒体分析器ffprobe
ffprobe也是FFmpeg源码编译后生成的一个可执行程序。ffprobe是一个非常强大的多媒体分析工具,可以从媒体文件或者媒体流中获得你想要了解的媒体信息,比如音频的参数、视频的参数、媒体容器的参数信息等。
例如它可以帮助分析某个媒体容器中的音频是什么编码格式、视频是什么编码格式,同时还可以得到媒体文件中媒体的总时长、复合码率等信息。使用ffprobe可以分析媒体文件中每个包的长度、报的类型、帧的信息等。例如:./ffprobe -show_streams output.mp4