YUV数据图形化理解

以下为音视频基础数据的图像化展示,方便大家理解

RGB24

RGB交替排列,RGBRGBRGB

占用空间Width*Height*3

YUV420P

YU12(I420)

每4个Y分量,共一个UV分量

Y是连续的,U也是连续的,V也是连续的

占用空间 Width*Height + Width*Height/4 + Width*Height/4

每4个Y分量,共一个UV分量

Y是连续的,U也是连续的,V也是连续的,只是V在U前面

占用空间 Width*Height + Width*Height/4 + Width*Height/4

        

YUV420SP

NV12

每4个Y分量,共一个UV分量

Y是连续的,UV是交替存放的,先U后V

占用空间 Width*Height + Width*Height/4 + Width*Height/4

NV21

每4个Y分量,共一个UV分量

Y是连续的,UV是交替存放的,先V后U

占用空间 Width*Height + Width*Height/4 + Width*Height/4

YUV422P

每两个Y分量,共一个UV分量

Y是连续的,U是连续的,V也是连续的

占用空间Width *Height + Width*Height/2 +Width*Height/2

        

YUYV422

每两个Y分量,共一个UV分量

YUV是间隔排列,按照 YUYV依次排列

占用空间Width *Height + Width*Height/2 +Width*Height/2

YUV444P

每一个Y分量对应一个U分量,对应一个V分量

占用空间Width *Height*3

结论:1. YUV各种格式体现的是其Y:U:V的排列方式和占比。

           2.理解这些就很容易看懂,比如以下代码:

YUV422:

YUV是间隔排列,按照 YUYV依次排列

大小为 2 * w * h

I420:

Y是连续的,U也是连续的,V也是连续的 

大小为 1.5 * w * h

1.Y分量0,2,4,6,8 这样隔一个取,I420连续存放

2.U分量1,5,9,13隔4个取一个

3.V分量3,7,13,17隔4个取一个

解析: yuv422[i * 2 * width + 4 * j + 1] 即 每行坐标每行起始位置(i * 2 * width)+ 每行偏移(4 * j + 1)

解析: yuv420[ynum + k * 2 * width / 4 + j]   即 每行坐标 =Y偏移(ynum)+ 行高(K)* 行宽(2 * width) /4 + 偏移(j)

为何除以4?

                          *2                                  /4

0,2,4,6,8 ==》0,4,8,12,16==》0,1,2,3,4 

即yuv420得到的是连续的角标

当然我们用其他的方式遍历,搞懂原理,大家各显神通

int YUV422To420(unsigned char yuv422[], unsigned char yuv420[], int width, int height)
{
 
	int ynum = width * height;
	int i, j, k = 0;
	//得到Y分量
	for (i = 0; i < ynum; i++) {
		yuv420[i] = yuv422[i * 2];
	}
	//得到U分量
	for (i = 0; i < height; i++) {
		if ((i % 2) != 0)continue;
		for (j = 0; j < (width / 2); j++) {
			if ((4 * j + 1) > (2 * width))break;
			yuv420[ynum + k * 2 * width / 4 + j] = yuv422[i * 2 * width + 4 * j + 1];
		}
		k++;
	}
	k = 0;
	//得到V分量
	for (i = 0; i < height; i++) {
		if ((i % 2) == 0)continue;
		for (j = 0; j < (width / 2); j++) {
			if ((4 * j + 3) > (2 * width))break;
			yuv420[ynum + ynum / 4 + k * 2 * width / 4 + j] = yuv422[i * 2 * width + 4 * j + 3];
 
		}
		k++;
	}
 
 
	return 1;
}

了解基本的YUV基础后,推荐一款libyuv的工具库,作为参考,方便我们后期功能的实现

GitHub - Yangandmore/libyuv_original: 补充libyuv功能的库,使libyuv更加完善

以下为其部分API

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/93457.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

68、使用aws官方的demo和配置aws服务,进行视频流上传播放

基本思想:参考官方视频,进行了配置aws,测试了视频推流,rtsp和mp4格式的视频貌似有问题,待调研和解决 第一步:1) 进入aws的网站,然后进入ioT Core 2)先配置 Thing types & Thing,选择香港的节点,然后AWS ioT--->Manage---> Thing type 然后输入名字,创建Th…

python下载bilibili视频,下载合集,下载选集

一. 内容简介 bilibili视频下载&#xff0c;下载合集&#xff0c;下载选集 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接&#xff1a;https://pan.baidu.com/s/1tO8xSmaqqoTxHI9P_UkDBw?pwd1234 提取码&#xff1a;1234 三.主要流程 3.1 …

浅谈大数据智能审计如何助力审计工作

随着互联网大数据的持续发展&#xff0c;大数据审计近年来面对着相等的机遇和挑战。那么&#xff0c;如果利用大数据等相关技术对审计工作作出突出贡献&#xff0c;单位和企业又该从何入手做好大数据审计工作应用&#xff0c;这些都成为每位审计人员将要面临的重要问题。 1. 政…

【MySQL系列】Select语句单表查询详解入门(SELECT,AS,模糊查询,运算符,逻辑运算符)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Unity——音乐、音效

在游戏运行的过程中&#xff0c;音效的播放时机与游戏当前内容密切相关&#xff0c;而且随着场景的变化、剧情的推进&#xff0c;背景音乐也需要适时切换&#xff0c;所以恰当地控制音乐和音效的播放非常重要。音乐和音效的播放、停止、切换和音量变化等&#xff0c;都需要由脚…

【Apollo】阿波罗自动驾驶系统:驶向未来的智能出行(含源码安装)

前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台&#xff0c;将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…

异地访问Oracle数据库的解决方案:利用内网穿透实现PL/SQL远程连接的建议与步骤

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle ​ 小月糖糖主页 在强者的眼中&#xff0c;没有最…

uniapp 实现地图距离计算

在uniapp中实现地图距离计算可以借助第三方地图服务API来实现。以下是一种基本的实现方式&#xff1a; 注册地图服务API账号&#xff1a;你可以选择使用高德地图、百度地图等提供地图服务的厂商&#xff0c;注册一个开发者账号并获取API密钥。 安装相关插件或SDK&#xff1a;根…

VR智慧校园资中控管理平台综合提升了课堂教学质量

随着越来越多高校在课堂中引进VR虚拟仿真实训系统&#xff0c;为了方便老师对全班同学进行高效率地管理&#xff0c;VR中控平台应运而生。下面为您详细介绍VR中控平台在课堂教学中的应用优势。 VR中控系统安装在教师总控端&#xff0c;融合了课件、视频、3D动画等丰富的教学资源…

VScode中写Verilog时,iverilog语法自动纠错功能不起作用

VScode中编写Verilog时&#xff0c;iverilog语法自动纠错功能不起作用 问题&#xff1a;按照教程搭建vscode下Verilog编译环境&#xff0c;发现语法纠错功能一直无效&#xff0c;检查了扩展Verilog-HDL/SystemVerilog/Bluespec SystemVerilog的配置也没有任何问题。 错误原因&a…

软考:中级软件设计师:HTML

软考&#xff1a;中级软件设计师:HTML 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff…

提升Java开发效率:掌握HashMap的常见方法与基本原理

文章目录 前言一、概述1. 认识HashMap2. HashMap 的作用和重要性3. 简要讲解 HashMap 的基本原理和实现方式 二、了解 HashMap 创建及其的常见操作方法1. HashMap的创建2. 添加元素 put()3. 访问元素 get()4. 删除元素 remove()5. 计算大小 size()6. 迭代 HashMap for-each7.判…

浏览器输入一个URL之后发生了什么?

URL解析DNS解析TCP连接TSL连接HTTP请求TCP挥手接收并解析响应 URL 解析 主要分为&#xff1a; 协议&#xff0c;eg http,https域名或者ip地址&#xff0c;eg www.baidu.com 域名相对于ip地址来说&#xff0c;更方便人们记忆&#xff0c;但是实际的网络传输中使用的是ip地址 端…

Redis 7 教程 数据持久化

总体 RDB 介绍 RDB 持久化以指定的时间间隔执行数据集的时间点快照 。 把某一时刻的数据和状态以文件的形式写到磁盘上,即使出现故障宕机,快照文件也不会丢失,数据的可靠性得到保证。快照文件就是RDB(Redis DataBase)文件(dump.rdb) 作用 在指定的时间间隔内将内存中的数…

leetcode304. 二维区域和检索 - 矩阵不可变(java)

前缀和数组 二维区域和检索 - 矩阵不可变题目描述前缀和代码演示 一维数组前缀和 二维区域和检索 - 矩阵不可变 难度 - 中等 原题链接 - 二维区域和检索 - 矩阵不可变 题目描述 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总…

FreeSWITCH 1.10.10 简单图形化界面3 - 阿里云NAT设置

FreeSWITCH 1.10.10 简单图形化界面3 - 阿里云NAT设置 0、 界面预览1、 查看IP地址2、 修改协议配置3、 开放阿里云安全组4、 设置ACL5、 设置协议中ACL&#xff0c;让PBX匹配内外网6、 重新加载SIP模块7、 查看状态8、 测试一下 0、 界面预览 http://myfs.f3322.net:8020/ 用…

面试之快速学习STL-常用算法

1. 排序算法 sort() 函数是基于快速排序实现的&#xff0c;故不保证相对位置&#xff0c;但是stable_sort (first, last)保证&#xff0c;它基于归并排序。sort()只适用于支持随机迭代器的容器&#xff08;array, vector, deque&#xff09;&#xff0c;好理解&#xff0c;毕竟…

3d素材库素材资源平台大大节省老师备课时间

教育元宇宙相信大家有所耳闻&#xff0c;3D素材云库通过数字三维建模技术将现实中的物体、天气、灯光等1&#xff1a;1模拟还原到虚拟场景中&#xff0c;让人们在教育元宇宙平台中可视、可见、可感。 在元宇宙爆发的大背景下&#xff0c;3D互联网传播内容也将迎来一次全面升级&…

java八股文面试[java基础]——如何实现不可变的类

知识来源&#xff1a; 【23版面试突击】如何实现不可变的类&#xff1f;_哔哩哔哩_bilibili 【2023年面试】怎样声明一个类不会被继承&#xff0c;什么场景下会用_哔哩哔哩_bilibili

leetcode 567. 字符串的排列(滑动窗口-java)

滑动窗口 字符串的排列滑动窗口代码演示进阶优化版 上期经典 字符串的排列 难度 -中等 leetcode567. 字符串的排列 给你两个字符串 s1 和 s2 &#xff0c;写一个函数来判断 s2 是否包含 s1 的排列。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 换句…