第一章的时候我们下载并编译了FFmpeg库。但好像都没介绍FFmpeg到底是干嘛的。
介绍
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。
组成
.exe文件(命令行文件):
- ffmpeg:用于对视频文档或音频档案转换格式。
- ffplay:一个简单的播放器,基于FFmpeg库(解码)与SDL(显示)。
- ffprobe:用于显示媒体文件的信息。
函数库:
- libavcodec:包含全部的音频/视频编解码库
- libavdevice:用于硬件的音视频采集、加速和显示
- libavfilter:提供了一个通用的音视频filter框架。使用avfilter可以对音视频数据做一些效果处理如去色调、模糊、水平翻转、裁剪、加方框、叠加文字等功能
- libavformat:包含多媒体容器格式的封装器和解封装器。如MP4、FLV、TS等文件封装格式,RTMP、RTSP、HLS等网络协议封装格式。
- libavresample:一个音频重采样,样本格式转换和混合的库
- libavutil:工具函数的库,包括随机数生成器、数据结构、数学工具、核心多媒体工具等功能。
- libpostproc:对于视频做后期效果处理的库
- libswresample:提供音频重采样,采样格式转换和混合等功能
- libswscale:高度优化的图像比例缩放、图像颜色空间/像素格式转换,如rgb与yuv之间转换。
libavcodec、libavformat、libavutil是较为主要也常用的库,提供了音视频开发的最基本功能,应用范围也是最广的。
注:写这篇文章的时候查了很多文章,发现并没有人写到libavresample和libswresample这俩库的区别。查了官方解释,发现这俩的描述也是一摸一样。所以暂时不去深究这俩的区别,之后用到了再深入研究。
常用类
介绍前再回顾下音视频处理流程:
根据功能可以分为以下几块:
-
解协议(http,rtsp,rtmp,mms)
- AVIOContext:管理输入输出数据的结构体;
- URLProtocol:描述了音视频数据传输所使用的协议,每种传输协议都对应一个URLProtocol结构体;
- URLContext:主要存储音视频使用的协议的类型以及状态。
-
解封装(flv,avi,rmvb,mp4)
- AVFormatContext:主要存储音视频封装格式中包含的信息;统领全局的结构体,贯穿始终。
- AVInputFormat:存储输入音视频使用的封装格式。每种音视频封装格式都对应一个AVInputFormat结构。
- AVOutputFormat:存储输出音视频使用的封装格式。每种音视频封装格式都对应一个AVOutputFormat结构。
-
解码(h264,mpeg2,aac,mp3)
- AVStream:每个存储一个视频/音频流的相关数据
- AVCodecContext:存储该视频/音频流使用解码方式的相关数据;
- AVCodec:包含该视频/音频对应的解码器,每种解码器都对应一个AVCodec结构;
每个AVStream对应一个AVCodecContext,每个AVCodecContext中对应一个AVCodec。就是AVStream结构体里有一个成员就是AVCodecContext。
-
存数据
- AVPacket:编码后、解码前的压缩数据,即H264码流数据或AAC;
- AVFrame:编码前、解码后的原始数据,如YUV格式的视频数据或PCM格式的音频数据等;
视频的话,每个结构一般是存一帧;音频可能有好几帧
对应关系如下:
官方技术文档:ffmpeg.org/doxygen/tru…
雷神博客:blog.csdn.net/leixiaohua1…
其他博客:
www.cnblogs.com/renhui/p/69…
www.cnblogs.com/linuxAndMcu…