AVFrame 解析
Posted helloc14
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AVFrame 解析相关的知识,希望对你有一定的参考价值。
AVFrame:
1)存储解码后的音频数据或视频数据.
2)AVFrame必须由av_frame_alloc() 来创建(Note:这只是用来创建AVFrame自身的内存空间,AVFrame结构体中的数据缓冲区,必须由其他方法来管理)
3)AVFrame必须由av_frame_free来释放
4)AVFrame通常只申请一次空间,然后多次复用来保存不同的数据(例如:一个AVFrame存放从解码器接收到的帧),在这种情况下,使用av_frame_unref(),引用计数-1,当引用计数为0时,释放data空间,并且在复用该数据前,会重置该结构体数据,还原成最原始的状态
注:In such a case, av_frame_unref() will free any references held by the frame and reset it to its original clean state before it is reused again. (这尼玛 翻译过来不是释放所有引用?是指引用计数直接变成0,然后释放data内存空间?而不是减一?)
5)后面还有,不翻译了。。。。。。
uint8_t *data[AV_NUM_DATA_POINTERS]:
1)指向平面图片或平面音频频道的指针
2)有可能与第一个分配的的字节不同(尼玛 啥意思???)
3)一些解码器在访问到超过图片 (0,0) - (宽,高)的范围,具体看avcodec_align_dimensions2()。一些过滤器和swscale可以读取到超出平台的16个字节数据,如果这些过滤器要被使用,16个额外的字节必须被申请(what are you 说啥嘞?)
int linesize[AV_NUM_DATA_POINTERS]:
1)对于视频而言,代表着每个图像行的大小(字节单位)
2)对于音频而言,代表着每个平面的大小(字节单位)
3)对于音频而言只能设置linesize[0],对于平台音频而言,每个平面通道都必须一样大小
4)对于视频而言linesizes应该是cpu字节对齐的倍数,对于现代桌面CPU而言基本是16或32
5)有些代码需要这样的对齐,有些代码在没有对齐的情况下会变得很慢,而有些代码则没有区别
6)注:linesize可能大于可用数据的大小——出于性能考虑,可能会有额外的填充
int width, height:
1)仅对视频帧,该帧图像的宽高。
int nb_samples:
1)该帧描述的音频样本(每个通道)的数量
int format:
1)帧的格式,-1代表未知或未设置
2)值对应的是视频的像素格式 enum AVPixelFormat,音频的样本格式 enum AVSampleFormat
int key_frame:
1)是否为关键帧(1:是 0:不是)
int64_t pts:
1)描述事件戳,以 time_base 时间基础为单位(应该显示给用户 该帧的时间)
int sample_rate:
1)音频的采样率
uint64_t channel_layout:
1)音频数据的通道布局(啥叫通道布局?)
int channels:
1)音频通道数,只用于音频
2)编码:未使用
3)解码:由用户来读取
备注:剩下一箩筐的参数,不一一列举,自个看头文件去吧。。。。。。
以上是关于AVFrame 解析的主要内容,如果未能解决你的问题,请参考以下文章
Libav AVFrame 到 Opencv Mat 到 AVPacket 的转换