YUV Format

本文详细介绍了YUV颜色格式在音视频处理中的应用,包括YUV下采样策略、不同比例(如4:4:4,4:2:2,4:2:0)及其在NV12格式中的体现。还提供了4:2:2转4:2:0的示例代码,以及推荐的8位YUV视频渲染格式。
摘要由CSDN通过智能技术生成

title: 音视频同步
date: 2024-02-26 21:01:24
comments: true #是否可评论
toc: true #是否显示文章目录
categories: #分类
- 多媒体技术
tags: #标签
- 多媒体技术
summary: YUV Format

YUV Format

简介

国际视频组织定义了多种yuv数据格式。文章中每一个像素都只有8bits去编码Y通道(也叫=Luma= Channel),同时使用8bits编码每一个U / V =chroma=(色度)的下采样样本点。YUV数据格式每个像素点小于24bits,=因为,UV分量数量会小于Y。=

Note

U 等价于 Cb V等价于Cr

YUV下采样

相较于luman(Y)通道,Chroma色度(U/V)通道会有更低的采样率,这并不会损失视觉质量。术语A:B:C描述了UV采样与Y采样的关系。

  • 4:4:4 表示,并不会对chroma通道进行下采样
  • 4:2:2 表示2:1水平下采样,水平每四个Y采样点含有2个U和2个V
  • 4:2:0表示2:1水平下采样,同时伴随2:1垂直下采样。
  • 4:1:1表示4:1水平下采样,每四个Y采样点含有1个U和1个V。

下列图片展示了,不同choma通道的下采样率。 Luma采样点用叉表示,chroma像素点用圆表示。

image-20240223172224521

4:2:0有两种格式,但是mpeg-2更适用于window,所以一般mpeg-2是4:2:0的默认形式。

Suraface定义

一般有以下策略:

基本概念如下:

surface origin surface的原点是(0,0),出在surface的左上角。

stride 含义代表surface宽度,单位为bytes

Alignment surface的对齐取决于图像显示驱动。surface必须是DWORD对齐。

packed format versus planar format 压缩格式与平面格式。

  • 在压缩格式中,yuv都存在一个单一数组中。
  • 在平面格式中,YUV会分别单独存放在三个分离的planes

下图为surface示意图。

image-20240223175153412

常见格式

NV12

特点:

  • 开始为Y分量,之后接着packed的UV分量。

image-20240223182508194

格式转换举例

def __conv422to420(self, src, dst):
        """
        422 -> 420

        http://www.mpeg.org/MPEG/video/mssg-free-mpeg-software.html
        although reference implementation reads data out-of-bounds,
        jp6 is the offending parameter. linking with electric-fence
        core-dumps. Bit-exact after change.
        """
        w = self.width >> 1
        h = self.height

        for i in xrange(w):
            for j in xrange(0, h, 2):
                jm5 = 0 if (j<5) else j-5
                jm4 = 0 if (j<4) else j-4
                jm3 = 0 if (j<3) else j-3
                jm2 = 0 if (j<2) else j-2
                jm1 = 0 if (j<1) else j-1
                jp1 = j+1 if (j<h-1) else h-1
                jp2 = j+2 if (j<h-2) else h-1
                jp3 = j+3 if (j<h-3) else h-1
                jp4 = j+4 if (j<h-4) else h-1
                jp5 = j+5 if (j<h-5) else h-1
                jp6 = j+5 if (j<h-5) else h-1 # something strange here
                                              # changed j+6 into j+5

                # FIR filter with 0.5 sample interval phase shift
                pel = ( 228*(src[i+w*j]  +src[i+w*jp1])
                      +70*(src[i+w*jm1]+src[i+w*jp2])
                      -37*(src[i+w*jm2]+src[i+w*jp3])
                      -21*(src[i+w*jm3]+src[i+w*jp4])
                      +11*(src[i+w*jm4]+src[i+w*jp5])
                      +5*(src[i+w*jm5]+src[i+w*jp6])+256)>>9

                dst[i+w*(j>>1)] = pel if pel > 0 else 0
                dst[i+w*(j>>1)] = pel if pel < 255 else 255
        return dst

代码实践

https://github.com/figgis/yuv-tools/blob/master/ycbcr.py

参考

Recommended 8-Bit YUV Formats for Video Rendering

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值