自己学习记录,方便以后查看。
=======================================================================================================================
ffmpeg关键结构体类型:
1)解协议
AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。
每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)。
2)解封装
AVFormatContext主要存储视音频封装格式中包含的信息;AVInputFormat存储输入视音频使用的封装格式。
每种视音频封装格式都对应一个AVInputFormat 结构。
3)解码
每个AVStream存储一个视频/音频流的相关数据;每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;
每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec结构。
4)存数据
视频的话,每个结构一般是存一帧;音频可能有好几帧
解码前数据:AVPacket
解码后数据:AVFrame
------------------------------------------------------------------------------------------------------------------------
AVOutputFormat:输出文件容器,包含音频、视频、字幕编码器ID
AVInputFormat: 输入文件容器
------------------------------------------------------------------------------------------------------------------------
AVFormatContext:它是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体,
包含:输入数据缓存、视音频流个数、视音频流、文件名、时长、码率,元数据等信息。
AVCodecContext:封装编解码器功能的结构体。包括:编解码器的类型(视频,音频...)、编解码器、平均码率、视频宽高、
运动估计参考帧个数、采样率(音频)、声道数(音频)、采样格式、
AVIOContext:FFMPEG管理输入输出数据的结构体。包括:缓存开始位置、缓存大小、当前指针读到的位置、
缓存结束位置、URLContext结构体。
-------------------------------------------------------------------------------------------------------------------------
AVPacket:存储压缩编码数据相关信息的结构体。包括压缩编码的数据、数据大小、显示时间戳(PTS)、解码时间戳(dts)。
对于H.264来说,1个AVPacket的data通常对应一个NAL。在使用FFMPEG进行视音频处理的时候,
常可以将得到的AVPacket的data数据直接写成文件,从而得到视音频的码流文件
AVFrame:一般用于存储原始数据(即非压缩数据,例如对视频来说是YUV,RGB,对音频来说是PCM),
包括:解码后的原始数据、视频宽和高、音频帧数、是否为关键帧、帧类型(I/P/B)、宽高比、
显示时间戳(pts)、帧序号、QP表等
AVStream:存储每一个视频/音频流信息的结构体。包括:视音频流序号、视音频流长度、元数据、帧率等
AVCodec:存储编解码器信息的结构体。包括:编解码器名字、媒体类型(视频、音频还是字幕)、编解码器ID、
支持的帧率(视频)、支持的像素格式(视频)、采样率(音频)、采样格式(音频)、声道数(音频)、私有数据大小。
AVDictionary:一个结构体,简单的key/value存储,经常使用AVDictionary设置或读取内部参数
===========================================================================================================================
=========================================================================================
重要结构体对应的函数:
AVFormatContext 初始化函数是avformat_alloc_context(),销毁函数是avformat_free_context()。
AVIOContext: 初始化函数是avio_alloc_context(), 销毁的时候使用av_free()释放掉其中的缓存
AVStream: 初始化函数是avformat_new_stream(), 销毁函数使用销毁AVFormatContext的avformat_free_context()
AVFrame: 初始化函数是av_frame_alloc(), 销毁函数是av_frame_free()
AVPacket: 初始化函数有两个:av_init_packet(),av_new_packet()。销毁函数是av_free_packet()。
AVOutputFormat 初始化函数av_guess_format(),
=========================================================================================
ffmpeg通用函数:
1)av_register_all():fmpeg注册复用器,编码器等。包括:
(a)avcodec_register_all():注册了和编解码器有关的组件。
(b)av_register_output_format():注册复用器
(c)av_register_input_format():注册解复用器
(d)ffurl_register_protocol():注册协议处理器
2)av_malloc()、av_free():内存的分配和释放
3)avio_open2():用于打开FFmpeg的输入输出文件
4)av_find_decoder():查找FFmpeg的编码器。输入参数编码器的ID
5)av_find_encoder():查找FFmpeg的解码器。输入参数解码器的ID
6)avcodec_open2():初始化一个视音频编解码器的AVCodecContext
7)avcodec_close():关闭编码器。
8)av_dump_format(): 打印关于输入或输出格式的详细信息,例如持续时间,比特率,流,容器,程序,
元数据,边数据,编解码器和时基。
9)avpicture_get_size():获取一帧图像的大小,p1:像素格式,p2和p3分别为宽和高。
10)avpicture_fill():为已经分配空间的AVFrame挂上一段用于保存数据的buffer。
11)av_sample_get_buffer_size():计算音频占用的字节数。
12)avcodec_fill_audio_frame():将分配空间后的buffer挂到AVFrame中
13) avformat_open_input():该函数用于打开多媒体数据并且获取一些信息
14) avformat_close_input():对应于13
15) avcodec_copy_context():拷贝输入视频码流的AVCodecContex的数值t到输出视频的AVCodecContex
16) avformat_alloc_output_context2(): 负责分配输出 AVFormatContext
17) av_compare_ts(): 比较时间戳,决定写入视频还是写入音频
18) av_read_frame(): 从输入文件读取一个AVPacket。
19) av_interleaved_write_frame(): 写入一个AVPacket到输出文件
-----------------------------------------------------------------------------------------
解码相关函数:
1)avformat_open_input():打开多媒体数据并且获得一些相关的信息
2)avformat_find_stream_info():读取一部分视音频数据并且获得一些相关的信息
3)av_read_frame():读取码流中的音频若干帧或者视频一帧
4)avcodec_decode_video2():解码一帧视频数据。输入一个压缩编码的结构体AVPacket,
输出一个解码后的结构体AVFrame
5)avformat_close_input():关闭一个AVFormatContext
-----------------------------------------------------------------------------------------
编码相关函数:
1)avformat_alloc_output_context2():初始化一个用于输出的AVFormatContext结构体
2)avformat_write_header():写视频文件头
3)av_write_frame():写视频数据
4)av_write_trailer():写视频文件尾
=========================================================================================