千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > NV12格式:从多个方面解析

NV12格式:从多个方面解析

来源:千锋教育
发布人:xqq
时间: 2023-11-23 13:18:50 1700716730

一、什么是NV12格式

NV12格式是一种常见的YUV格式之一,主要用于存储和传输视频数据。它采用了4:2:0的采样方式,即对于每4个Y像素只有2个U和2个V像素。

在NV12格式中,前半部分存储Y分量,后半部分存储UV分量,其中U和V交替存储,每一个U或V占用一个字节大小,所以UV总共占用一半的Y分量大小。

下面是采用NV12格式存储的一个10x10的图像示例:


0000000000 1111111111 0000000000 1111111111 0000000000
0000000000 1111111111 0000000000 1111111111 0000000000
0000000000 1111111111 0000000000 1111111111 0000000000
0000000000 1111111111 0000000000 1111111111 0000000000
0000000000 1111111111 0000000000 1111111111 0000000000
1111111111 2222222222 1111111111 2222222222 1111111111
1111111111 2222222222 1111111111 2222222222 1111111111
1111111111 2222222222 1111111111 2222222222 1111111111
1111111111 2222222222 1111111111 2222222222 1111111111
1111111111 2222222222 1111111111 2222222222 1111111111

二、NV12格式的优点

1. 尺寸小:相比于RGB格式视频数据,采用YUV格式的视频数据,尺寸较小。因为它能够减少色彩信息的冗余,将Y分量采样率降低却不影响整体的色彩质量。

2. 适合网络传输:采样率的优化使得NV12格式的视频数据较为紧凑,适合在网络传输中使用。且NV12格式在H.264视频压缩中的支持很好,更加适合网络传输。

3. 显示平滑:NV12格式是整个视频系统中最常用的格式,广泛应用于视频采集、视频编码、网络传输和视频解析。在播放时,采用NV12格式能够使得视频画面更加平滑,色彩层次更加丰富。

三、NV12格式的应用场景

1. 视频采集:NV12格式适用于许多视频采集设备的图像处理,如摄像机、手机摄像头等。采用NV12格式,能够更好地减轻系统的压力,提高采集效率,保证视频质量的同时还能降低成本。

2. 视频传输:在视频传输中,NV12格式能够较好地适应各种传输场景,如本地视频播放、网络视频直播、视频会议等。它的压缩效率高、数据传输量小,能够保证大流量数据的高清传输及较低传输延迟。

3. 视频编辑:在视频编辑中,NV12格式能够更好地控制视频质量和压缩比,保证更好的用户体验。同时,NV12格式的采样方式与H.264格式视频编码的采样率非常匹配,能够充分发挥H.264的编码技术,提高视频编辑的效率和质量。

四、如何使用NV12格式

在实际开发中,使用NV12格式需要注意以下几点:

1. 适当处理图像边界:由于在NV12格式中,U和V采用交替存储的方式,因此处理图像边界时需要注意采样方式上的差异。

2. 显示器支持:在使用NV12格式时,需要先检查显示器是否支持该格式。否则,我们需要在应用中进行格式的转换,增加应用的开发和维护难度。

3. 资源消耗:在使用NV12格式时,由于需要大量的色彩转换和采样处理,会对系统资源产生一定的压力。因此,在实际应用中需要综合考虑各方面的因素,选择最适合的处理方式。

五、NV12格式的代码示例


// NV12 to RGB
void NV12_RGB(unsigned char* yuyv, unsigned char* rgb, int width, int height) {
    int frameSize = width * height;
    int i = 0, j = 0;
    int Y, U, V, R, G, B;
    int index = 0;
    for (i = 0; i < height; i++) {
        for (j = 0; j < width; j++) {
            Y = (0xff & ((int)yuyv[index]));
            U = (0xff & ((int)yuyv[width * height + (i / 2) * width + (j / 2) * 2 + 0]));
            V = (0xff & ((int)yuyv[width * height + (i / 2) * width + (j / 2) * 2 + 1]));
            R = Y + (V - 128) + ((V - 128) * 103 / 256);
            G = Y - ((U - 128) * 88 / 256) - ((V - 128) * 183 / 256);
            B = Y + (U - 128) + ((U - 128) * 198 / 256);

            if (R < 0) {
                R = 0;
            } else if (R > 255) {
                R = 255;
            }

            if (G < 0) {
                G = 0;
            } else if (G > 255) {
                G = 255;
            }

            if (B < 0) {
                B = 0;
            } else if (B > 255) {
                B = 255;
            }

            rgb[index * 3 + 0] = (unsigned char)R;
            rgb[index * 3 + 1] = (unsigned char)G;
            rgb[index * 3 + 2] = (unsigned char)B;
            index++;
        }
    }
}

六、总结

本文从NV12格式的定义、优点、应用场景、使用方法以及代码示例等多个方面进行了详细的讲解。NV12格式是一种常用的YUV格式之一,采用了4:2:0的采样方式,在视频应用开发中具有广泛的应用前景。

tags: nv12
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT