FFmpeg学习之一:基本数据结构
来源:互联网 发布:cmd 映射网络磁盘 编辑:程序博客网 时间:2024/06/05 08:09
1,AVCodecContext
FFmpeg中最庞大的结构体之一,含有很多字段,主要描述编解码上下文,包含编解码需要的参数信息。结构体通常通过调用avformat_open_input和avformat_find_stream_info函数(分析输入文件)初始化,也可以手动初始化。
extradata/extradata_size
这个buffer中存放了解码器可能会用到的额外信息,如h.264中的sps和pps,在av_read_frame中填充。一般来说,首先,某种具体格式的demuxer在读取格式头信息的时候会填充extradata,其次,如果demuxer没有做这个事情,比如可能在头部压根儿就没有相关的编解码信息,则相应的parser会继续从已经解复用出来的媒体流中继续寻找。在没有找到任何额外信息的情况下,这个buffer指针为空。
time_base
编解码器的时间基准,实际上就是视频的帧率(或场率)
width/height
视频的宽和高
sample_rate/channels
音频的采样率和信道数目
sample_fmt
音频的原始采样格式
codec_name/codec_type/codec_id/codec_tag
编解码器的信息
2, AVFormatContext
FFmpeg中最基本的结构体,很多函数都要用到它作为参数,是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体。
AVStream **streams
描述包含的媒体流
Int nb_streams
描述媒体流的数量
AVInputFormat *iformat
输入数据的封装格式,对应demux的指针
AVOutputFormat *oformat
对应mux的指针
AVIOContext *pb
输入数据的缓存
Enum AVCodecID 音、视、字幕
编解码ID
AVCodec音、视、字幕
编解码
AVDictionary *metadata
元数据
视频的原数据(metadata)信息可以通过AVDictionary获取。元数据存储在AVDictionaryEntry结构体中,是一个键值对,通过av_dict_get、av_dict_set函数存取
3, AVStream
描述一条媒体流,AVFormatContext中用双重指针串联媒体流。大部分域的值可以由avformat_open_input根据文件头的信息确定,缺少的信息需要通过调用avformat_find_stream_info读帧及软解码进一步获取。
index/id
index对应流的索引,这个数字是自动生成的,根据index可以从AVFormatContext::streams表中索引到该流;而id则是流的标识,依赖于具体的容器格式。比如对于MPEG TS格式,id就是pid
time_base
流的时间基准,是一个实数,该流中媒体数据的pts和dts都将以这个时间基准为粒度。通常,使用av_rescale/av_rescale_q可以实现不同时间基准的转换
start_time
流的起始时间,以流的时间基准为单位,通常是该流中第一个帧的pts
duration
流的总时间,以流的时间基准为单位
need_parsing
对该流parsing过程的控制域
nb_frames
这条媒体流中的帧数
r_frame_rate/framerate/avg_frame_rate
帧率相关
codec
指向该流对应的AVCodecContext结构,调用avformat_open_input时生成
parser
指向该流对应的AVCodecParserContext结构,调用avformat_find_stream_info时生成
4, AVCodec
直接对应一种编解码器,FFmpeg中所有的编解码器都是连在一个链表中,AVInputFormat也一样,前者通过avcodec_find_decoder/ av_codec_next函数搜寻,后者通过av_find_input_format/av_iformat_next函数。
结构体中含有init/ encode2/decode/ close等函数指针,函数入口由具体要调用的编解码器决定。
const char *name
编解码名称
enum AVCodecID id
ID
int (*init)(AVCodecContext *)
初始化函数指针,以下均是函数指针
(*encode2)
编码
(*decode)
解码
(*close)
关闭Codec
(*flush)
刷新buffer,当seeking时使用
5, AVPacket
暂存媒体数据包及附加信息(解码时间戳、显示时间戳、时长等),这样的媒体数据包所承载的往往不是原始格式的音视频数据,而是以某种方式编码后的数据,编码信息由对应的媒体流结构AVStream给出。
dts/ pts
解码/显示时间戳,单位是所属媒体流的时间基准
stream_index
所属媒体流的索引,如音频、视频
data/ size
编码数据/长度,如H.264通常对应一个NAL
duration
时长
pos
该数据在媒体流中的字节偏移量
destruct
用于释放数据缓冲区的函数指针
flags
标志域,最低为置1表示该数据是一个关键帧
6, AVFrame
一般用于存储原始数据(例如对视频来说是YUV,RGB,对音频来说是PCM),此外还包含了一些相关的信息。比如说,解码的时候存储了宏块类型表,QP表,运动矢量表等数据.
7, AVIOContext
FFmpeg管理输入输出数据的结构体
unsigned char *buffer
缓存地址
int buffer_size
缓存大小(默认32768)
unsigned char *buf_ptr
当前指针读取到的位置
unsigned char *buf_end
缓存结束的位置
void *opaque
URLContext结构体
buffer用于存储ffmpeg读入的数据。例如打开一个视频文件的时候,先把数据从硬盘读入buffer,然后在送给解码器用于解码。URLContext结构体中包含一个结构体URLProtocol,URLProtocol中含有协议名以及各种与读写相关的函数指针,具体入口由调用的协议决定。比如file、udp、rtmp等。
- FFmpeg学习之一:基本数据结构
- 数据结构之一(基本数据结构)
- ffmpeg 学习 之几个基本数据结构之间联系
- 基本数据结构之一:结构体
- ffmpeg SDK 基本数据结构和函数
- [ffmpeg]视频编解码学习之一:理论基础
- 数据结构学习笔记之一:链表
- 数据结构学习笔记之一:链表
- 数据结构学习记录之一查找
- 《ffmpeg学习之一——编译安装ffmpeg》
- qibuild学习之一-------基本使用
- redis学习之一基本命令
- FFMPEG学习【libavutil】:数据结构(一)
- FFMPEG学习【libavutil】:数据结构(二)
- FFMPEG学习【libavutil】:数据结构(三)
- FFMPEG学习【libavutil】:数据结构(四)
- ffmpeg 基本数据结构和对象(一): AVPacket、AVPicture、AVFrame
- ffmpeg--学习笔记1-基本使用
- 第七周项目二 求圆柱体表面积
- Deformable Part Model中mex文件在windows下运行的修改方法
- PHP 合并图像 imagecopymerge 函数(水印制作实例)
- 我的Sqlserver 学习笔记
- makefile学习——编译生成静态库文件
- FFmpeg学习之一:基本数据结构
- Undefined symbols for architecture armv7: "_NEON_Matrix4Mul", referenced from:
- 关于android4.0中访问网络不能在主线程中进行以及Handler的使用
- css的样式继承和层叠
- 【Java】java中的this
- linux sort,uniq,cut,wc命令详解
- 插入排序-----自理解(详细注释)
- Linux系统分析工具之uptime,top(一)
- centos 安装setuptools、mysqldb