入门推荐大神资料:
1. jerrywu145:ffmpeg小白10day
2. 雷神博客和视频
3.ffmpeg编程基础和一些常见问题的解答
4. ffmpeg专栏
bin文件中可以看到8个库:
一、FFmpeg的8个库
- avdevice : 硬件的音视频采集、加速和显示。
- avfilter:滤镜特效处理。
- avformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息、读取音视频数据等功能。各种流媒体协议代码(如rtmpproto.c等)以及音视频格式的(解)复用代码(如flvdec.c、flvenc.c等)都位于该目录下
- avcodec:编解码,音视频各种格式的编解码。各种格式的编解码代码(如aacenc.c、aacdec.c等)都位于该目录下。
- postproc: 用于后期效果处理,如图像的去块效应等。
- swresample:音频采样数据格式转换,提供音频重采样,采样格式转换和混合等功能。
- swscale:提供原始视频的比例缩放、色彩映射转换、图像颜色空间或格式转换的功能。
- avutil:包含一些公共的工具函数的使用库,包括算数运算,字符操作等。
二、FFmpeg的常用数据结构
1. 封装格式
-
AVFormatContext
描述媒体文件的构成及基本信息,封装格式上下文结构体,是统领全局的基本结构体,很多函数需要使用它作为参数,保存了视频文件封装格式相关信息。AVFormatContext是FFMpeg格式转换过程中实现输入和输出功能、保存相关数据的主要结构。每一个输入和输出文件,都在如下定义的指针数组全局变量中有对应的实体。
static AVFormatContext *output_files[MAX_FILES]; static AVFormatContext *input_files[MAX_FILES];
对于输入和输出,因为共用的是同一个结构体,所以需要分别对该结构中如下定义的iformat或oformat成员赋值。
struct AVInputFormat *iformat; struct AVOutputFormat *oformat;
对一个AVFormatContext来说,二个成员不能同时有值,即一个AVFormatContext不能同时含有demuxer和muxer。
主要变量
struct AVInputFormat *iformat:输入数据的封装格式
AVIOContext *pb:输入数据缓存
unsigned int nb_streams:音视频流个数(输入视频的AVStream 个数)
AVStream **streams:音视频流(输入视频的AVStream []数组)
char filename[1024]:文件名
int64_t duration:时长(单位:us)(输入视频的时长(以微秒为单位))
int bit_rate:比特率(输入视频的码率)
AVDictionary *metadata:元数据 -
AVInputFormat / AVOutputFormat
解复用器对象,每种作为输入的封装格式对应一个该结构体。
复用器对象,每种作为输出的封装格式对应一个该结构体。根据输入和输出流的不同,AVStream结构都是封装在AVInputStream和 AVOutputStream结构中,在av_encode( )函数中使用。
AVInputStream中还保存的有与时间有关的信息。
AVOutputStream中还保存有与音视频同步等相关的信息。主要变量
long_name:封装格式的长名称
extensions:封装格式的扩展名
id:封装格式ID
一些封装格式处理的接口函数 -
AVStream
用于描述一个视频或者音频流的相关数据信息,视频文件中每个视频(音频)流对应一个该结构体。AVStream结构保存与数据流相关的编解码器,数据段等信息。比较重要的有如下二个成员:
AVCodecContext *codec; /**< codec context */ void *priv_data; 其中codec指针保存的是encoder或decoder结构。 priv_data指针保存的是和具体编解码流相关的数据, 在ASF的解码过程中,priv_data保存的就是ASFStream结构的数据。
主要变量
AVCodecContext codec:视频/音频流的AVCodecContext
AVRational time_base:时间基准,真正的时间 =PTStime_base
int64_t duration:该视频/音频流时间长度
AVDictionary *metadata:元数据信息
AVRational avg_frame_rate:帧率
AVPacket attached_pic:附加图片
2. 编解码
-
AVCodecContext
描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息。保存AVCodec指针和与codec相关的数据,如video的width、height,audio的sample rate等。AVCodecContext中的codec_type,codec_id二个变量对于encoder/decoder的匹配来说,最为重要。
enum CodecType codec_type; /* see CODEC_TYPE_xxx */ enum CodecID codec_id; /* see CODEC_ID_xxx */ 如上所示,codec_type保存的是CODEC_TYPE_VIDEO,CODEC_TYPE_AUDIO等媒体类型, codec_id保存的是CODEC_ID_FLV1,CODEC_ID_VP6F等编码方式。
以支持flv格式为例,在前述的av_open_input_file(…… ) 函数中,匹配到正确的AVInputFormatdemuxer后,通过av_open_input_stream( )函数中调用AVInputFormat的read_header接口来执行flvdec.c中的flv_read_header( )函数。在flv_read_header( )函数内,根据文件头中的数据,创建相应的视频或音频AVStream,并设置AVStream中AVCodecContext的正确的codec_type值。codec_id值是在解码过程中flv_read_packet( )函数执行时根据每一个packet头中的数据来设置的。
主要变量
codec:编解码器的AVCodec
width, height:图像的宽高(只针对视频)
pix_fmt:像素格式(只针对视频)
sample_rate:采样率(只针对音频)
channels:声道数(只针对音频)
sample_fmt:采样格式(只针对音频) -
AVCodec
编解码器对象,每种编解码格式对应一个该结构体,每一个AVCodecContext都包含一个AVCodec;主要变量
name:编解码器名称
long_name:编解码器长名称
type:编解码器类型
id:编解码器ID
一些编解码的接口函数 -
AVCodecParameters
编解码参数,每个AVStream中都含有一个AVcodecParameters,用于存放当前流的编解码参数。主要变量
enum AVMediaType codec_type 编码数据的一般类型;
enum AVCodecID codec_id 特定类型的编码数据(使用的编解码器);
uint32_t codec_tag 有关编解码器的其他信息;
uint8_t *extradata 初始化解码器所需的额外二进制数据,依赖于编解码器;
int extradata_size extradata内容的大小(以字节为单位);
int64_t bit_rate 编码数据的平均比特率(以每秒位数为单位)
3. 网络协议
-
AVIOContext
管理输入输出的结构体。字节IO 上下文。主要变量
unsigned char * buffer 启动缓冲区
int buffer_size 最大缓冲区大小
unsigned char * buf_ptr 缓冲区当前位置
unsigned char * buf_end 如果读取函数返回的数据少于请求数据,则数据结束可能小于buffer + buffer_size -
URLProtocol
描述音视频数据传输所使用的协议,每种传输协议对应一个URLContext结构。主要变量
-
AVPacket
用于保存读取的packet数据。存储一帧压缩编码数据。存放编码后,解码前的压缩数据,即ES数据。主要变量
uint8_t *data:压缩编码数据,一个AVPacket的data通常对应一个NAL。
int size:data的大小
int64_t pts:显示时间戳
int64_t dts:解码时间戳
int stream_index:标识该AVPacket所属的视频/音频流。 -
AVFrame
该结构描述了解码的(原始)音频或视频数据。存放编码前,解码后的原始数据,如YUV格式的视频数据或PCM|格式的音频数据等.主要变量
data:解码后的图像像素数据(音频采样数据)。
linesize:对视频来说是图像中一行像素的大小;对音频来说是整个音频帧的大小。
width, height:图像的宽高(只针对视频)。
key_frame:是否为关键帧(只针对视频) 。
pict_type:帧类型(只针对视频) 。例如I,P,B。