本文主要是介绍视频处理学习笔记1:YUYV422、NV12和h264,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近因为工作关系在恶补视频相关知识点,在此做一记录便于日后复习。
以下均是个人学习经验总结,可能存在错误和坑,欢迎大佬指教。
工作中用到的是YUYV422存储格式。存储的就是裸流YUYV422格式文件。
YUYV422是两个像素点共用一个UV分量,每个像素点2byte,两个像素点也就是Y00 U00 Y01 V00,4byte,也就是Y、U、V每个分量各1byte。存储结构大致如下:
Y00 U00 Y01 V00 Y02 U01 Y03 V01 .......
Y10 U10 Y11 V10 Y12 U11 Y13 V11 .......
Y20 U20 Y21 V20 Y22 U21 Y23 V21 .......
Y30 U30 Y31 V30 Y32 U31 Y33 V31 .......
NV12是四个像素点共用一个UV分量,每个分量1byte。YUYV422转NV12后,存储结构大致如下:
Y00 Y01 Y02 Y03 .......
Y10 Y11 Y12 Y13 .......
Y20 Y21 Y22 Y23 .......
Y30 Y31 Y32 Y33 .......
U01 V01 U03 V03 .......
U21 V21 U23 V23 .......
以下是对应代码:
#include <stdio.h>void yuyv422_to_nv12(char * image_in, char* image_out, int width, int height, unsigned long int filesize)
{/* 计算循环次数,YUYV 一个像素点占2个字节*/int pixNUM = width * height;unsigned int cycleNum = filesize /pixNUM/2;printf("cycleNUM = %d\n",cycleNum);/*单帧图像中 NV12格式的输出图像 Y分量 和 UV 分量的起始地址,并初始化*/char *y = image_out;char *uv = image_out + pixNUM ;char *start = image_in;unsigned int i =0; int j =0,k =0;/*处理Y分量*/for(i= 0; i<cycleNum ;i++){int index =0;for(j =0; j< pixNUM*2; j=j+2) //YUYV单行中每两个字节一个Y分量{*(y+index) = *(start + j);index ++;}start = image_in + pixNUM*2*i;y= y + pixNUM*3/2;}/**处理UV分量**/start = image_in;for(i= 0; i<cycleNum ;i++){int uv_index = 0;for(j=0; j< height; j =j+2) // 隔行, 我选择保留偶数行{for(k = j*width*2+1; k< width*2*(j+1); k=k+4) //YUYV单行中每四个字节含有一对UV分量{*(uv+ uv_index) = *(start + k);*(uv +uv_index+1) = *(start +k +2);uv_index += 2;}}start = image_in + pixNUM*2*i;uv =uv + pixNUM*3/2;}
}int main(int argc, char **argv) {if (argc < 4) {printf("useage: %s [src] [width]x[height] [dst]\n", argv[0]);return -1;}int width;int height;sscanf(argv[2], "%dx%d", &width, &height);printf("width:%d height:%d \n",width, height);// int col = width;// int row = height;FILE* inFile = NULL;FILE* outFile = NULL;inFile = fopen(argv[1],"rb");if (inFile == NULL) {printf("open src error\n");return -1;}outFile = fopen(argv[3], "wb");if (outFile == NULL) {printf("open dst error\n");fclose(inFile);return -1;}char nv12Buf[height*width*3/2]={0};char yuyvBuf[width*height*2]={0};int frames = 0;while (!feof(inFile)){fread(yuyvBuf, sizeof(yuyvBuf), 1, inFile);yuyv422_to_nv12(yuyvBuf,nv12Buf, width, height, sizeof(yuyvBuf));fwrite(nv12Buf, width*height*3/2, 1, outFile);fflush(outFile);printf("frame:%d\n",++frames);}fclose(outFile);fclose(inFile);
}
这篇关于视频处理学习笔记1:YUYV422、NV12和h264的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!