类型avframe 类型中
uint8_t *data[AV_NUM_DATA_POINTERS]; 解码后的原始数据,视频数据是YUV 和RGB,音频数据是PCM)
int linesize[AV_NUM_DATA_POINTERS];data中“一行“数据的大小,一般大于图像的宽
int width, height; 对视频而言指视频的宽和高
int nb_samples; 音频中一个AVFrame包含多个音频帧,表示音频帧的数量
int format; 帧的格式,原始数据的类型
int key_frame; 是否为关键帧
enum AVPictureType pict_type; 帧的类型
AVRational sample_aspect_ratio; 宽高比
int64_t pts; 显示时间戳
int64_t pkt_dts;每一帧的时间
int coded_picture_number;编码帧的序号
int display_picture_number;显示帧的序号
int sample_rate; 采样率(音频)
uint64_t channel_layout; 声道格式(音频)
int channels; 声道数量(编码未使用),解码只读
int interlaced_frame;是否隔行扫描
int8_t *qscale_table;QP表
int quality; 帧的质量,1表示好 FF_LAMBDA_MAX表示bad
enum AVColorRange color_range; MPEG,JPEG,YUV的色彩范围
enum AVColorSpace colorspace; YUV的色彩空间
int64_t pkt_duration; 相关包的流逝时间
AVDictionary *metadata;元数据
其中data中分为不同类型
AVPacket::stream_index 可以区分码流类型
解码器类型AVCodecContext::pix_fmt 可以区分流格式AV_PIX_FMT_YUVJ420P AV_PIX_FMT_YUV420P
这两个类型色彩空间不一样yuv420p是[16,235] yuvj420p是针对显示器 0~255 data的数据排布是一样的
avframe::data是一个char*数组 data【0】是y数据 data【1】是u data[2]是v 针对视频
如果需要转换yuv数据直接拷贝data中数据就好 但是有时候linesize是0 可以剔除 linesize可能根yuv数据的实际宽度不同 可能会大因为内存对其的规则
char* cbuff = m_yuvTemp;
for(i = 0;i<videoFrame->height;i++){
memcpy(cbuff+videoFrame->linesize[0]*i,videoFrame->data[0]+videoFrame->linesize[0]*i,videoFrame->width);
}
cbuff+=videoFrame->width*videoFrame->height;
for(i = 0;i<videoFrame->height/2;i++){
memcpy(cbuff+videoFrame->linesize[2]*i,videoFrame->data[2]+videoFrame->linesize[2]*i,videoFrame->width/2);
}
cbuff+=videoFrame->width*videoFrame->height/4;
for(i = 0;i<videoFrame->height/2;i++){
memcpy(cbuff+videoFrame->linesize[1]*i,videoFrame->data[1]+videoFrame->linesize[1]*i,videoFrame->width/2);
}