1. yuv422,yuv420,yuv444的区别。
YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。
YUV 4:2:0采样,每四个Y共用一组UV分量。
2. yuv444
假如图像视720※576的
yuv444,图片的大小是720 x 576x3个字节,是总像素大小的3倍
y的字节是720 x 576
u的字节是720 x 576
v的字节是720 x 576
YUV444: 每一个Y分量用一组UV分量, 单个像素占用空间为: 1byte(Y) + 1byte(U) + 1byte(V) = 3 byte
一帧占用空间大小为, frameSize = frameWidth * frameHeight * 3(byte)
3. yuv422
图片的大小是720 x 576 x 2个字节,是总像素大小的2倍,
y的字节是720 x 576
u的字节是720 x 576 /2,一半帧宽度, 高度同帧高度
v的字节是720 x 576 /2, 一半帧宽度, 高度同帧高度
YUV422: 每两个Y分量用一组UV分量, 单个像素占用空间为: 1byte(Y) + 1/2 byte(U) + 1/2 byte(V) = 2 byte
一帧占用空间大小为, frameSize = frameWidth * frameHeight * 2(byte)
4. yuv420
图片的大小是720 x 576 x 3/2 个字节,是总像素大小的1.5倍
y的字节是720x576 w*h
u的字节是720x576 /4 (w/2) * (h/2)
v的字节是720x576 /4 (w/2) * (h/2)
YUV420: 每四个Y分量用一组UV分量, 单个像素占用空间为: 1byte(Y) + 1/4 byte(U) + 1/4 byte(V) = 1.5 byte
一帧占用空间大小为, frameSize = frameWidth * frameHeight * 1.5(byte)
5. yuv420p在AVFrame中的存储
YUV420P(planar格式)在ffmpeg中存储是在struct AVFrame的data[]数组中
data[0]——-Y分量
data[1]——-U分量
data[2]——-V分量
linesize[]数组中保存的是对应通道的数据宽度
linesize[0]——-Y分量的宽度
linesize[1]——-U分量的宽度
linesize[2]——-V分量的宽度
lineSize因为要做内存对齐, 不一定等于各个分量的宽度
6. 保存YUV数据
void saveAVFrame_YUV_ToTempFile(AVFrame *pFrame)
{
int t_frameWidth = pFrame->width;
int t_frameHeight = pFrame->height;
int t_yPerRowBytes = pFrame->linesize[0]; //单位
int t_uPerRowBytes = pFrame->linesize[1];
int t_vPerRowBytes = pFrame->linesize[2];
QFile t_file("E:\\receive_Frame.yuv");
t_file.open(QIODevice::WriteOnly);
for(int i = 0;i< t_frameHeight ;i++), //逐行循环
{
t_file.write((char*)(pFrame->data[0]+i*t_yPerRowBytes),t_frameWidth);
}
for(int i = 0;i< t_frameHeight/2 ;i++) //逐行循环, 1/2 行数高度
{
t_file.write((char*)(pFrame->data[1]+i*t_uPerRowBytes),t_frameWidth/2); //1/2宽度
}
for(int i = 0;i< t_frameHeight/2 ;i++) //逐行循环, 1/2 行数高度
{
t_file.write((char*)(pFrame->data[2]+i*t_vPerRowBytes),t_frameWidth/2); //1/2宽度
}
t_file.flush();
}
7. RGB
RGB24一帧的大小size=width×heigth×3 Byte
RGB32一帧的大小size=width×heigth×4 Byte
RGB24 一个像素有R,G,B三个分量,所以一个像素就占用3个字节。