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 解析的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg结合SDL编写播放器

Fmpeg总结AV系列结构体之AVFrame

Libav AVFrame 到 Opencv Mat 到 AVPacket 的转换

FFmpeg5.0源码阅读——AVFrame

如何从 NSImage/UIImage 获取 AVFrame(ffmpeg)

AVFrame到QImage的高效转换