代码改变世界

Metal笔记(三)使用Metal渲染YUV420P/NV12

  jiayayao  阅读(618)  评论(0编辑  收藏  举报

一、YUV格式介绍

    首先,YUV格式有两大类,一类是planar,一类是packed。planar格式是先存储所有像素点的Y,然后是所有像素点的U,最后是所有像素点的V;packed格式是每个像素点的YUV连续交叉存储。

    YUV三个分量中,Y表示明亮度(Luminance),表示灰度值;UV表示色度(Chrominance),表示影像色彩及饱和度,用于指定像素的颜色。

    RGBA每个像素占用4个字节,最终一张图像的字节数是w*h*4;而YUV420P每个像素占用1.5个字节,一张图像的字节数是w*h*1.5,YUV三个分量的字节数之比是4:1:1。

    YUV420P中的Y是每个像素一个字节,每4个像素一个U,一个V。常见的YUV420P和NV12等格式的数据分布如下图所示。

二、Metal渲染YUV

    Metal在渲染时,也要根据YUV格式进行调整。

2.1 iOS定义pixel format

kCVPixelFormatType_{长度|序列}{颜色空间}{Planar|BiPlanar}{VideoRange|FullRange}

    其中Planar: 平面;BiPlanar:双平面。平面/双平面主要应用在yuv上。uv分开存储的为Planar,反之是BiPlanar。所以,kCVPixelFormatType_420YpCbCr8PlanarFullRange是420p,kCVPixelFormatType_420YpCbCr8BiPlanarFullRange是nv12.

    VideoRange和FullRange的区别在于数值的范围,FullRange颜色比VideoRange更丰富一些。

相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏