初学音视频(一)-RGB和YUV格式分析

来源:互联网 发布:python作用 编辑:程序博客网 时间:2024/05/30 22:55

前言

  • 有幸能够看到雷霄骅先生的博客,很感谢雷神能够这么无私把知识分享出来,对我这种新手的帮助实在是太大了。希望到另一个世界雷神不用再这么辛苦的。
  • 本篇文章基本全是参考雷神的:视音频数据处理入门:RGB、YUV像素数据处理
  • 学完这篇文章,任务本篇文章的核心就是YUV和RGB这种颜色编码在内存中是如何存储的,像BMP(或者JPG)封装格格式到底是什么东西的。
  • 本篇文章是在C语言的基础上写的,因为我是做android的,最近才学了一点C语言基础的,刚好派上用场了。
  • 需要的YUV,RGB等格式的查看工具:雷神分享了 这些工具和源文件 。在这些工具中一个叫:yuvplayer.exe的程序是可以查看YUV格式的内容的

实际操作

1.分离YUV420P像素数据中的Y、U、V分量

  • 代码如下:
int main1(void){   //打开一个文件   只读权限    FILE *fp=fopen("/home/huangyu/HYtestYUV/lena_256x256_yuv420p.yuv","rb+");    int a= access("/home/huangyu/HYtestYUV/lena_256x256_yuv420p.yuv",0);     printf("a=%d",a);     // 文件是否存在        if( a != 0 ){        printf("%s","the file isnot exit");    }    FILE *fp1=fopen("/home/huangyu/HYtestYUV/graybar_640x360y.y","wb+");    FILE *fp2=fopen("/home/huangyu/HYtestYUV/graybar_640x360u.y","wb+");   FILE *fp3=fopen("/home/huangyu/HYtestYUV/graybar_640x360v.y","wb+");    int w=256;    int h=256;    //申请一个yuv420大小的内存空间    unsigned char *pic=(unsigned char *)malloc(w*h*3/2);    int num = 1;    int i = 0 ;    for (i = 0 ; i <num ; i++){         //将fp文件的内容读取到pic内存中         fread(pic , 1 , w*h*3/2 ,fp);        //Y data        //将pic内容一个字节一个字节写入fp1        fwrite(pic , 1 , w*h , fp1);        //U data        fwrite(pic + w * h , 1 , w * h / 4 ,fp2);        //V data        fwrite(pic + w * h * 5 / 4 , 1 , w * h / 4 , fp3);    }    printf("%s","end work");    free( pic );    fclose ( fp );    fclose ( fp1 );    fclose ( fp2 );    fclose ( fp3 );     return 0;}
  • 这个小点要了解YUV在内存中的存放方式,这个本身这个图片是420P的图片,420P的图片是4个Y对应一对UV,那么内存大小就是 宽度 * 高度(YYYY) + 宽度 * 高度/2(UV),这是数据量,在内存中的储存方式是YYYYYYYY….UU.VV.,这个的….是指前 宽 * 高 的byte中存储的全是YYYY的信息,然后才有UUUUUUUU…,把U存储完后才会存储VVVVVVV… 。

总结不下去了 简单的把重点的知识勾勒一下,明天继续

分离YUV420P像素数据中的Y、U、V分量和分离YUV444P像素数据中的Y、U、V分量这两个分割中

  • 要了解420P和444P在内存中的存储方式,这个P代表了Planar这种存储方式,仔细看:http://blog.csdn.net/tkp2014/article/details/42110885。像素的采样位数一律为8bit这个概念还没弄清楚
  • 软件查看YUV Y这种后缀文件的时候要转换格式和固定分辨率
  • 这里注意 YUV在内存中的存储格式和YUV本身的排列格式是两个概念。

将YUV420P像素数据去掉颜色(变成灰度图) 、将YUV420P像素数据的亮度减半

  • 这里要注意 为什么设置unsigned char *p来定义 把-128-127 转换成0-255 这样容易减半
  • 这里注意数据对 颜色 和亮度的影响是如何造成的

将YUV420P像素数据的周围加上边框

  • 加深对YUV420P这种存储方式的理解,可以用方形框框来描述这种存储方式的

    生成YUV420P格式的灰阶测试图

  • 一个算法而已

计算两个YUV420P像素数据的PSNR

  • PSNR的概念,注意计算的方式就OK
  • 我的取值一个是26 左右的, 还有我用U还是V的数据 进行比较的时候 数据是36

分离RGB24像素数据中的R、G、B分量

  • 弄清楚RGB24这种图像在内存中的存储方式的

将RGB24格式像素数据封装为BMP图像

  • bmp分装的格式 两个头里面都包括什么东西,目前还没有测试成功

将RGB24格式像素数据转换为YUV420P格式像素数据

  • 这种转换的格式要记住
  • 核心:
  • 从源代码可以看出,本程序实现了RGB到YUV的转换公式:
    Y= 0.299*R+0.587*G+0.114*B
    U=-0.147*R-0.289*G+0.463*B
    V= 0.615*R-0.515*G-0.100*B
    要注意的地方
    1) RGB24存储方式是Packed,YUV420P存储方式是Plander。
    2) U,V在水平和垂直方向的取样数是Y的一半

生成RGB24格式的彩条(算法注意一下)

0 0