libavformat:
用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。
libavcodec:
用于各种类型声音/图像编解码;该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能,libavcodec 库被其他各大解码器 ffdshow,Mplayer 等所包含或应用。
libavdevice :
硬 件 采 集 、 加 速 、 显 示 。 操 作 计 算 机 中 常 用 的 音 视 频 捕 获 或 输 出 设 备 :ALSA,AUDIO_BEOS,JACK,OSS,1394,VFW。
libavfilter:
filter(FileIO、FPS、DrawText)音视频滤波器的开发,如宽高比 裁剪 格式化 非格式化 伸缩。
libavutil:
包含一些公共的工具函数的使用库,包括算数运算 字符操作;
libavresample:
音视频封转编解码格式预设等。
libswscale:
(原始视频格式转换)用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565,rgb888 等与 yuv420 等之间转换。
libswresample:
原始音频格式转码
libpostproc:
(同步、时间计算的简单算法)用于后期效果处理;音视频应用的后处理,如图像的去块效应。
FFmpeg结构体说明:
AVFormatContext:解封装功能的结构体
struct AVInputFormat *iformat:输入数据的封装格式
AVIOContext *pb:输入数据的缓存
unsigned int nb_streams:视音频流的个数
AVStream **streams:视音频流
char filename[1024]:文件名
int64_t duration:时长(单位:微秒us,转换为秒需要除以1000000)
int bit_rate:比特率(单位bps,转换为kbps需要除以1000)
AVDictionary *metadata:元数据
AVCodecContext:编解码器
enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx 编解码器的类型,声音,视像等等*/
const struct AVCodec *codec;//解码器
enum AVCodecID codec_id; /* see AV_CODEC_ID_xxx */// 编解码器的ID
int sample_rate; //采样率
int channels; //声音通道数
enum AVSampleFormat sample_fmt; //声音采样格式
Avstream:
存储每一个视频/音频流信息的结构体
int index:标识该视频/音频流
AVCodecContext *codec:指向该视频/音频流的AVCodecContext(它们是一一对应的关系)
AVRational time_base:时基。通过该值可以把PTS,DTS转化为真正的时间。FFMPEG其他结构体中也有这个字段,但是根据我的经验,只有AVStream中的time_base是可用的。PTS*time_base=真正的时间
int64_t duration:该视频/音频流长度
AVDictionary *metadata:元数据信息
AVRational avg_frame_rate:帧率(注:对视频来说,这个挺重要的)
AVPacket attached_pic:附带的图片。比如说一些MP3,AAC音频文件附带的专辑封面。
AvCodec:
存储编解码器信息的结构体
const char *name:编解码器的名字,比较短
const char *long_name:编解码器的名字,全称,比较长
enum AVMediaType type:指明了类型,是视频,音频,还是字幕
enum AVCodecID id:ID,不重复
const AVRational *supported_framerates:支持的帧率(仅视频)
const enum AVPixelFormat *pix_fmts:支持的像素格式(仅视频)
const int *supported_samplerates:支持的采样率(仅音频)
const enum AVSampleFormat *sample_fmts:支持的采样格式(仅音频)
const uint64_t *channel_layouts:支持的声道数(仅音频)
int priv_data_size:私有数据的大小
AvPacket:
用来存放编码后的视频帧数据
pts 显示时间戳
dts 解码时间戳
stream_index Packet所在stream的index
flats 标志,其中最低为1表示该数据是一个关键帧
duration 数据的时长,以所属媒体流的时间基准为单位
pos 数据在媒体流中的位置,未知则值为-1
convergence_duration 该字段已被deprecated,不再使用
AvFrame:
是包含码流参数较多的结构体
uint8_t *data[AV_NUM_DATA_POINTERS]:解码后原始数据(对视频来说是YUV, RGB,对音频来说是PCM)
int linesize[AV_NUM_DATA_POINTERS]:data中“一行”数据的大小。注意:未必等于图像的宽,一般大于图像的宽。
int width, height:视频帧宽和高(1920x1080,1280x720...)
int nb_samples:音频的一个AVFrame中可能包含多个音频帧,在此标记包含了几个
int format:解码后原始数据类型(YUV420,YUV422,RGB24...)
int key_frame:是否是关键帧
enum AVPictureType pict_type:帧类型(I,B,P...)
AVRational sample_aspect_ratio:宽高比(16:9,4:3...)
int64_t pts:显示时间戳
int coded_picture_number:编码帧序号
int display_picture_number:显示帧序号
int8_t *qscale_table:QP表
uint8_t *mbskip_table:跳过宏块表
int16_t (*motion_val[2])[2]:运动矢量表
uint32_t *mb_type:宏块类型表
short *dct_coeff:DCT系数,这个没有提取过
int8_t *ref_index[2]:运动估计参考帧列表(貌似H.264这种比较新的标准才会涉及到多参考帧)
int interlaced_frame:是否是隔行扫描
uint8_t motion_subsample_log2:一个宏块中的运动矢量采样个数,取log的
常用函数:
av_register_all();注册复用器、编码器,必须在开始的时候调用;
avformat_open_input();打开多媒体数据并且获得相关的一些信息;
avformat_find_stream_info():可以读取一部分视音频数据并且获得一些相关的信息;
avcodec_open2();该函数用于初始化一个视音频编解码器的AVCodecContext
avcodec_find_encoder()用于查找FFmpeg的编码器,avcodec_find_decoder()用于查找FFmpeg的解码器。
avcodec_decode_video2()的作用是解码一帧视频数据。输入一个压缩编码的结构体AVPacket,输出一个解码后的结构体AVFrame
sws_getContext():初始化一个SwsContext。
sws_scale():处理图像数据。
sws_freeContext():释放一个SwsContext。
avpicture_get_size();解码后一帧图像的大小
结构体 |
初始化 |
销毁 |
AVFormatContext |
avformat_alloc_context() |
avformat_free_context() |
AVIOContext |
avio_alloc_context() |
|
AVStream |
avformat_new_stream() |
|
AVCodecContext |
avcodec_alloc_context3() |
|
AVFrame |
av_frame_alloc(); av_image_fill_arrays() |
av_frame_free() |
AVPacket |
av_init_packet(); av_new_packet() |
av_free_packet() |