RGB、YUV420、NV21、I420编码区别

一、RGB与YUV

首先了解视频编码为什么使用YUV420而不是rgb。那么需要了解两者的原理,看图说话

所以从内存的角度来说,yuv单位像素使用的内存更低,但是两者表示的效果是一致的,也可以认为rgb过度绘制了,把人眼无法分辨的区域也进行了绘制。

下面看一下两者之间内存暂用对比,这里采用·rgb24对比

RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。在一个2*2的像素区域,RRG暂用的字节数为2*2*3=12字节。那么用yuv表示,占用的字节数为4(Y)+1(u)+1(v)=6字节,其中Y占用4个字节,U和V各占用1字节,比例为4:1:1

所以在一个宽高为w*h的设备上,使用rgb表示编码占用的字节数为w*h*3,使用yuv表示暂用的内存为w*h*+w*h/4+w*h/4 = w*h*3/2.

二、YUV与NV21

首先需要了解的是yuv有很多编码格式,其中yuv420就是一种,而nv21又是yuv420的一种。并且nv21是针对android设备的视频编码。

nv21编码格式:比如一张1920*1280的图片,经过nv21编码后,会变成前面1920*1280字节全是Y,从1920*1280字节长度开始,U和V会交替排列,它们的字节长度分别为1920*1280/4。请看下图

如图颜色框,4个Y会对应一个UV。

三、NV21与I420

I420也是YUV420编码格式的一种,由于android手机厂商的原因,摄像头采集到的数据永远都是经过NV21编码的数据,但是对于这种数据不能够显示在苹果或windows平台,那么需要对这个编码格式的数据需要重新编码,其中I420这种编码格式,所有的厂商都是适配的。

I420编码格式:比如一张1920*1280的图片,经过I420编码后,会变成前面1920*1280字节全是Y,从1920*1280字节长度开始,会先排列U,总字节长度为1920*1280/4,从1920*1280+1920*1280/4开始排列V,字节长度为1920*1280/4,所以总的字节长度适合NV21一样的,只是UV的编码顺序不一样。请看下图:

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FFmpeg 是一个非常强大的工具,它可以将各种视频和音频格式转换为其他格式。对于将 YUV420 格式转换为 QImage 格式,这通常涉及一些处理步骤,因为 FFmpeg 并不直接提供这种转换。下面是一种可能的实现方法: 首先,需要明确 YUV420 是一种颜色编码方式,通常用于视频和图像。QImage 是 Qt 库中的一个类,用于表示图像。 以下是一个简单的步骤说明: 1. **使用 FFmpeg 提取 YUV420 图像**:首先,你需要使用 FFmpeg 从视频文件中提取 YUV420 图像。FFmpeg 有很多选项和过滤器可以用于处理视频文件,你可以使用 `ffmpeg` 命令行工具执行这个操作。 例如,要从视频文件 "input.mp4" 中提取帧并将其保存为 "output.yuv",你可以使用以下命令: ```bash ffmpeg -i input.mp4 -vframes 1 output.yuv ``` 这将提取视频的第一帧并保存为 "output.yuv"。 2. **使用 OpenCV 将 YUV420 转换为 QImage**:一旦你有了 YUV420 图像文件,你可以使用 OpenCV 库将其转换为 QImage。OpenCV 是另一个强大的计算机视觉库,它提供了许多功能,包括图像处理和转换。 以下是一个简单的 Python 代码片段,使用 OpenCV 将 YUV420 文件转换为 QImage: ```python import cv2 import numpy as np from PyQt5.QtGui import QImage, QPixmap # 读取 YUV420 图像文件 img = cv2.imread('output.yuv') # 将图像转换为 numpy 数组,并指定 BGR 颜色空间 rgb_img = cv2.cvtColor(img, cv2.COLOR_YUV2BGR_NV12) rgb_img = np.array(rgb_img, dtype=np.uint8) rgb_img = rgb_img[...,::-1] # 从 (0,y,u,v) 到 (u,v,y,0) 的顺序 # 将 numpy 数组转换为 QImage qimage = QImage(rgb_img.data, rgb_img.shape, rgb_img.shape, rgb_img.shape*rgb_img.strides, QImage.Format_RGB888) pixmap = QPixmap(qimage) ``` 注意:这段代码假设你的系统上已经安装了 FFmpeg 和 OpenCV,并且你正在使用 PyQt5(用于处理 QImage 和 Pixmap)。如果你的环境不同,你可能需要调整代码以适应你的具体需求。 请注意,YUV420编码是一种用于视频和图像的常见编码方式,但并不是所有图像查看器或库都支持这种格式。因此,在某些情况下,你可能需要将 YUV420 图像转换为其他格式(如 RGB)才能使用 QImage 或其他库进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值