音视频开发3 视频基础,图片基础

1.RGB彩色原理

2.YUV

3.像素,分辨率,位深,帧率,码率,Stride跨距

像素 像素是一个图片的基本单位, pix 是英语单词 picture的简写,加上英 语单词“元素element”,就得到了“pixel”,简称 px ,所以“像素”有“图像元素” 之意。
例如 2500 × 2000 的照片就是指横向有 2500 个像素点,竖向有 2000 个像素点,总共是 500
个像素,也俗称 500 万像素照片。
分辨率 是指图像的大小或尺寸。比如 1920x1080
常见的分辨率:
360 P (640x360) 720P(1280x720) 1080P(1920x1080) 4K(3840x2160) 8K(7680x4320)
常说的 1080 720 其实是指垂直像素数,分辨率除去垂直像素,还需要考虑到水平像
素数。按照 16:9 ( : ) 的比例计算, 720p 的水平像素数为 720 ÷ 9 × 16 = 1280 ,总
计像素为 921600 像素即大约为 92 万像素。 1080p 具有 1920 个水平像素,总计 2073600
像素即约 200 万像素,是 720p 的两倍多。
位深:
我们看到的彩色图片,都有三个通道,分别为红 (R) 、绿 (G) 、蓝 (B) 通道。(如果需
要透明度则还有 alpha 分量)
通常每个通道用 8bit 表示, 8bit 能表示 256 种颜色,所以可以组成
256*256*256=16,777,216 = 1677 万种颜色。
这里的 8bit 就是我们讲的位深。
每个通道的位深越大,能够表示的颜色值就越大 ,比如现在高端电视说的 10bit
彩,即是每个通道用 10bit 表示,每个通道有 1024 种颜色。 1024*1024*1024 约为
10,7374 万色 =10 亿色,是 8bit 64 倍。
常见的颜色还是 8bit 居多。
帧率
FPS (每秒有多少帧画面),经常玩游戏的同学应该会对这个词很熟悉。我们玩游
戏时, FPS 帧率越高就代表游戏画面越流畅,越低则越卡顿。视频也是如此。
由于视觉图像在视网膜的暂时停留,一般图像帧率能达到 24 帧,我们就认为图像是连续
动态的。
电影帧率一般是 24fps (帧每秒);
电视剧一般是 25fps
监控行业常用 25fps
音视频通话常用 15fps
帧率越高,画面越流畅,需要的设备性能也越高。
码率
视频文件在单位时间内使用的数据流量。比如 1Mbps
◼大多数情况下码率越高分辨率越高,也就越清晰。但模糊的视频文件大小(码率)也
可以很大,分辨率小的视频文件可能也比分辨率大的视频文件清晰。
◼对于同一个原始图像源的时候,同样的编码算法,则码率越高,图像的失真就会越小,视频画面就会越清晰
Stride跨距--RGB说明
Stride :指在内存中每行像素所占的空间。为了实现 内存对齐 每行像素在内存中所占
的空间并不一定是图像的宽度。
Stride 就是这些扩展内容的名称, Stride 也被称作 Pitch,如果图像的每一行像素末尾拥有扩展内容, Stride 的值一定大于图像的宽度值,就像下图所示:
比如分辨率 638x480 RGB24 图像,我们在内存处理的时候如果要 16 字节对齐
638*3/16=119.625 不能整除,因此不能 16 字节对齐,我们需要在每行尾部填充 6
个字节。就是 (638+2->640), 640*3/16=120 。此时该图片的 stride 1920 字节。
Stride 跨距  , 指的是  在 内存中 每行像素 占用的空间  , 由于 系统 对 图像有 跨距对齐 的要求 , 这个  Stride 跨距 可能 大于等于 实际的 图像像素 所占用的 宽度 ;

分辨率为 638 x 480 的 RGB24 格式的图片 , 内存处理时 以 16 字节对齐 ;

RGB24 格式中 R ( 红 ) / G ( 绿 ) / B ( 蓝 ) 每个分量占用 8 位 ( 1 字节 ) , 一个像素总共占用 24 位 ( 3 字节 ) ;

每一行的 实际像素 所占用的内存是 638 * 3 = 1914 字节 ;

需要以 16 字节对齐 , 最后一个字节占用的实际 内存大小 是 1914 % 16 = 10 字节 ,

因此 还需要 额外补充 16 - 10 = 6 字节的填充字节 ,

最终达到 638 * 3 + 6 = 1920 字节

4.YUV内存对齐问题 Stride跨距

YUV 跨距对齐 概念

YUV 跨距 ( Stride ) 对齐 是 图像处理 过程中 内存对齐 概念 ;

在 处理 YUV 格式的 图像 时 , 系统 或 硬件设备 要求 , YUV 图像的 每一行 像素 , 在 内存空间 中 需要 进行对齐操作 ;


Stride 跨距对齐 是 为了满足 特定 的 内存访问模式 的要求 , 有些系统要求 进行 跨距对齐 ,

要求 YUV 图像 的 每行内存宽度 必须是 " 内存对齐长度 " 的整数倍 ,
如果 YUV 图像 的 每行内存宽度 不是 " 内存对齐长度 " 的整数倍 , 就需要在 每行 的末尾添加 填充字节 , 以达到 跨距对齐 要求 ;
被填充的字节 , 没有实际意义 , 不包含图像数据 ;
这个 " 内存对齐长度 " 可能是 16 字节 / 32 字节 / 64 字节 等 ;

举例说明:

要求 内存处理 YUV 图像时 , 以 16 字节对齐 , 现在有一张图片 638 x 480 像素的 YUV420P 图片 ;

举例1:YUV420P 数据存储

YUV420P 数据存储 格式如下图所示 , 不同类型的分量放在不同的数组中 ,

YUV 4:4:4采样,每一个Y对应一组UV分量。

YUV 4:2:2采样,每两个Y共用一组UV分量。

YUV 4:2:0采样,每四个Y共用一组UV分量

Y 灰度值 分量 , 存储在 最上面的数组中 , 在下图的 Y0 ~ Y15 的 灰度值 就是存放在一个数组中 ;
U 色度值 分量 , 存储在 中间数组中 , 在下图的 U0 ~ U3 的 色度值 就是存放在一个数组中 , U 的个数只有 4 个 , 是 Y 分量个数的一半 ;
V 色度值 分量 , 存储在 最下面的数组中 , 在下图的 V0 ~ V3 的 色度值 就是存放在一个数组中 , V 分量 的个数只有 4 个 , 是 Y 分量 个数的一半 ;

上面的 YUV 图像 内存数据 中 ,

Y0 , Y1 , Y4 , Y5 灰度值 使用 U0V0 色度值 , 4 个像素用了 6 字节 , 一个像素 1.5 字节 ;
Y2 , Y3 , Y6 , Y7 灰度值 使用 U1V1 色度值 , 4 个像素用了 6 字节 , 一个像素 1.5 字节 ;
Y8 , Y9 , Y12 , Y13 灰度值 使用 U2V2 色度值 , 4 个像素用了 6 字节 , 一个像素 1.5 字节 ;
Y10 , Y11 , Y14 , Y15 灰度值 使用 U3V3 色度值 , 4 个像素用了 6 字节 , 一个像素 1.5 字节 ;

图片的像素格式是 638 x 480 像素 ;

在上面 YUV420P 格式的图像中 , 每一行 每个像素 只占 1 字节 , 那么 该图像 在内存中 , 每行的长度 是 638 字节 ;


每一行的 实际像素 所占用的内存是 638 字节 ;

需要以 16 字节对齐 , 最后一个字节占用的实际 内存大小 是 638 % 16 = 14 字节 ,

因此 每行 还需要 额外补充 16 - 14 = 2 字节的填充字节 ,

最终达到 638 + 2 = 640 字节 ;

举例2:YUV420的内存计算

width * hight =Y(总和)

U = Y / 4   V = Y / 4

所以YUV420 数据在内存中的长度是 width * hight * 3 / 2(即一个YUV是1.5个字节),所以计算采集的数据大小:width * hight * 1.5*frame*time

以720×488大小图象YUV420 planar为例,

其存储格式是: 共大小为720×480×3 × 1.5字节,

分为三个部分:Y,U和V

Y分量:    (720×480)个字节

U(Cb)分量:(720×480 × 1/4)个字节

V(Cr)分量:(720×480 × 1/4)个字节

三个部分内部均是行优先存储,三个部分之间是Y,U,V 顺序存储。

即YUV数据的0--720×480字节是Y分量值,

720×480--720×480×5/4字节是U分量

720×480×5/4 --720×480×3/2字节是V分量。

5.YUV数据存储格式

6.画面绿屏

这里涉及到两个知识:一个知识点是解码,当“视频包队列” 被 "视频解码" 的时候,理论上会解码出正常的YUV数据,

一个知识点 是 从YUV数据 转码成 RGB。

YUV(256 级别) 可以从8位RGB 直接计算:
Y = 0.299*R + 0.587*G + 0.114*B;
U = -0.169*R -0.331*G + 0.5 *B ;
V = 0.5 *R -0.419*G -0.081*B;

反过来,RGB 也可以直接从YUV (256级别) 计算:
R = Y + 1.402 (Y-128)
G = Y -0.34414 (U-128) -0.71414 (U-128)
B = Y + 1.772 (V-128)

当解码失败的时候,YUV 的三个值都会变成0.

因为解码失败时YUV分量都填为0值,然后根据公式:
R = 1.402 * (-128) = -126.598
G = -0.34414*(-128) -0.71414*(-128) = 44.04992 + 91.40992 = 135.45984 
B = 1.772 * (-128) = -126.228

RGB 值范围为 [0 255] ,所以最终的值为:
R = 0
G = 135.45984
B = 0
此时只有 G 分量有值所以为 绿色

7.H264编码原理

8.H264 I,P,B帧的关系

9.音视频同步:


AUdio Master 同步视频到音频
video master 同步音频到视频
external clock master:同步音频和视频 到外部时钟

一般情况下 audio master > external clock master > video master

10 DTS


decoding time stamp 解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据
一般来讲,我们如果不做算法方面的工作,一般不需要关注DTS


11 PTS


presentation time stamp 显示时间戳,这个时间戳来告诉播放器该在什么时候显示这一帧的数据
主要是关注PTS,这一帧数据可能是音频数据,也可能是视频数据。

图片像素(Pixel)

一张图片是由多少个 像素 构成的。

例如一张图片是由60x50组成的。

位深度 bit depth

RGB表示法

Red)、绿Green)、Blue)

除了24bit,常见的位深度还有:

  • 1bit:2种颜色,黑白两色
  • 3bit:8种颜色,用于大部分早期的电脑显示器,红绿蓝各占1位
  • 8bit:256种颜色,用于最早期的彩色Unix工作站,红色占3位、绿色占3位、蓝色占2位
  • 16bit:红色占5位、蓝色占5位、绿色占6位
  • 24bit:也被称为是:真彩色(True Color),也就是常说的24位真彩

  • 32bit:基于24位,增加8个位的透明通道
    • 可以表示带有透明度的颜色
    • 比如CSS中的rgba(255, 0, 0, 0.5)表示50%透明度的红色

YUV 表示法:

Y、U、V三个分量组成,现在通常说的YUV指的是YCbCr

  • Y:表示亮度(Luminance、Luma),占8bit(1字节)
  • CbCr:表示色度(Chrominance、Chroma)
    • Cb(U):蓝色色度分量,占8bit(1字节)
    • Cr(V):红色色度分量,占8bit(1字节)

YUV和RGB 比较:体积更小

YUV的优势是比 RGB拥有更小的体积

  • 如果使用RGB
    • 比如RGB888(R、G、B每个分量都是8bit)
    • 1个像素占用24bit(3字节)
  • 如果使用YUV
    • 1个像素可以减小至平均只占用12bit(1.5字节)
    • 体积为RGB888的一半

YUV 的采样格式

采样格式通常用A:B:C的形式来表示,比如4:4:4、4:2:2、4:2:0等,其中我们最需要关注的是4:2:0

YUV 的存储格式

YUV的存储格式可以分为3大类:

  • Planar(平面)
    • Y、U、V分量分开单独存储
    • 名称通常以字母p结尾
  • Semi-Planar(半平面)
    • Y分量单独存储,U、V分量交错存储
    • 名称通常以字母sp结尾
  • Packed(紧凑)
    • 或者叫Interleaved (交错)
    • Y、U、V分量交错存储

YUV 的常用类型,结合采样格式和存储格式

4:4:4 表示 :每一个Y ,对应一组UV

4:2:2 表示:每两个Y,对应一组UV

4:2:0表示:每4个Y,对应一组UV

YUV存储格式带来的问题-YUV Stride对齐问题--todo?

比如分辨率 638x480的YUV420P图像,我们在内存处理的时候如果要以16字节对齐(),则638不能被16整除,我们需要在每行尾部填充2个字节。变成640,此时,该图片的YUV分量中的Y stride为640字节,对应U 和 V 都320字节,

音视频开发进阶|图像位深、宽高、跨距 - 知乎

4:4:4

  • I444
Y Y Y Y
Y Y Y Y
U U U U
U U U U
V V V V
V V V V

  • YV24
Y Y Y Y
Y Y Y Y
V V V V
V V V V
U U U U
U U U U

  • NV24
Y Y Y Y
Y Y Y Y
U V U V U V U V
U V U V U V U V

  • NV42
Y Y Y Y
Y Y Y Y
V U V U V U V U
V U V U V U V U

4:2:2

  • I422
Y Y Y Y
Y Y Y Y
U U
U U
V V
V V

  • YV16
Y Y Y Y
Y Y Y Y
V V
V V
U U
U U

  • NV16
Y Y Y Y
Y Y Y Y
U V U V
U V U V

  • NV61
Y Y Y Y
Y Y Y Y
V U V U
V U V U

  • UYVY
U Y V Y U Y V Y
U Y V Y U Y V Y

  • YUYV
Y U Y V Y U Y V 
Y U Y V Y U Y V 

  • YVYU
Y V Y U Y V Y U
Y V Y U Y V Y U

4:2:0

I420 (YUV420P)

  • 大多数视频解码器以I420格式输出原始图片
 
Y Y Y Y
Y Y Y Y
U U
V V

  • YV12
Y Y Y Y
Y Y Y Y
V V
U U
  • NV12

Y Y Y Y
Y Y Y Y
U V U V

  • NV21
Y Y Y Y
Y Y Y Y
V U V U

总结

图片有2个要素,视频有3个要素。

像素,RGB/YUV类型,fps(每秒播放多少个图片)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从Python整数变量内存大小占用28字节谈起

实验结果 本机环境64位Python 3.12 内存布局图 0 4 8 12 16 20 24 28 |----------|----------|----------|----------|----------|----------|----------| | ob_refcnt | ob_type | ob_digit | …

Llama3-Tutorial(Llama 3 超级课堂)-- 笔记

第1节—Llama 3 本地 Web Demo 部署 端口转发 vscode里面设置端口转发 https://a-aide-20240416-b4c2755-160476.intern-ai.org.cn/proxy/8501/ ssh -CNg -L 8501:127.0.0.1:8501 rootssh.intern-ai.org.cn -p 43681参考 https://github.com/SmartFlowAI/Llama3-Tutorial/b…

分享5个免费AI写作软件

在数字化时代,人工智能(AI)正以惊人的速度渗透到我们生活的方方面面,而写作领域也不例外。AI写作工具的出现,不仅改变了传统的写作流程,更在创意表达、文本生成、语言校正等方面展现了其独特的优势。这些工…

Pyhton专题学习资料包,Python从入门到精通全套学习资料[30G]

资源概览 百本Python学习书籍大礼包百本前端学习书籍大礼包微专业-数据挖掘分析之Python篇小甲鱼零基础入门学习Python(全96集) 资源获取 🧑‍💻【Pyhton专题资料】【30G】 百本Python书籍## 百本前端书籍 微专业-数据挖掘分析之Python篇 预备课【先…

安全测试|常见SQL注入攻击方式、影响及预防

SQL注入 什么是SQL注入? SQL注入是比较常见的网络攻击方式之一,主要攻击对象是数据库,针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,篡改数据库。 SQL注入简单来说就是通过在表单中填写包含SQL关键…

【爬虫之scrapy框架——尚硅谷(学习笔记one)--基本步骤和原理+爬取当当网(基本步骤)】

爬虫之scrapy框架——基本原理和步骤爬取当当网(基本步骤) 下载scrapy框架创建项目(项目文件夹不能使用数字开头,不能包含汉字)创建爬虫文件(1)第一步:先进入到spiders文件中&#x…

缓存菜品操作

一:问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大。 二:实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: 每个分…

Windows远程桌面实现之十四:实现AirPlay接收端,让苹果设备(iOS,iPad等)屏幕镜像到PC端

by fanxiushu 2024-05-04 转载或引用请注明原始作者。 这个课题已经持续了好几年,已经可以说是很长时间了。 实现的程序是 xdisp_virt, 可以去github下载使用:GitHub - fanxiushu/xdisp_virt: xfsredir file system 一开始是基于测试镜像驱动的目的随便开…

【数据库原理及应用】期末复习汇总高校期末真题试卷05

试卷 一、选择题 1.( )是存储在计算机内有结构的数据的集合。 A.数据库系统 B.数据库 C.数据库管理系统 D.数据结构 2.数据库的三级模式结构中,数据库对象—视图是( ) A.外模式 B.内模式 C.存储模式 D.模式 3.在下列关于关系表的陈述中,错误的是(…

idea无法识别加载pom.xml文件

有时idea无法识别加载pom.xml文件,直接打开pom.xml文件,然后添加到maven就行

8种常见的CMD命令

1.怎么打开CMD窗口 步骤1:winr 步骤2:在弹出的窗口输入cmd,然后点击确认,就会出现一个cmd的窗口 2.CMD的8种常见命令 2.1盘符名称冒号 说明:切换盘的路径 打开CMD窗口这里默认的是C盘的Users的27823路径底下&#xf…

容器化Jenkins远程发布java应用(方式一:pipline+ssh)

1.创建pipline工程 2.准备工程Jenkinsfile文件(java目录) 1.文件脚本内容 env.fileName "planetflix-app.jar" env.configName "planetflix_prod" env.remoteDirectory "/data/project/java" env.sourceFile "/…

vue数据大屏并发请求

并发? 处理并发 因为js是单线程的,所以前端的并发指的是在极短时间内发送多个数据请求,比如说循环中发送 ajax , 轮询定时器中发送 ajax 请求. 然后还没有使用队列, 同时发送 的. 1. Promise.all 可以采用Promise.all处理并发, 当所有pro…

NX二次开发——测量距离(两个对象之间最近、最远距离)

一、概述 最近看到 一些文章比较有趣,所以做个记录,顺便写一下博客,附上全部代码,方便刚从事NX二次开发同僚的理解。本次主要模拟NX自带的测量工具中对两个实体对象进行测量距离。NX系统功能如下所示: 二、代码解析 主…

【MySQL】SQL基本知识点DML(2)

目录 1.DML添加数据 2.DML-修改数据 (1)改​编辑 (2)删​编辑​编辑 3.DQL-基本查询 (1)查询多个字段​编辑​编辑​编辑 (2)设置别名 (3)去重操作 4…

【设计模式】JAVA Design Patterns——Abstract-document

🔍 目的 使用动态属性,并在保持类型安全的同时实现非类型化语言的灵活性。 🔍 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全,并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…

百度地图API 快速入门

一、创建一个应用 创建成功可以在应用程序中查看到自己的ak密钥 二、基本使用 2.1 显示地图 在static下创建demo1.html &#xff08;将密钥换成自己的就可以显示地图了&#xff09; 示例&#xff1a; <!DOCTYPE html> <html> <head><meta name"…

[每周一更]-(第96期):Rsync 用法教程:高效同步文件与目录

文章目录 一、引言二、rsync 基本概念三、介绍rsync 是什么&#xff1f;四、安装五、rsync 基本语法常见示例&#xff08;默认ssh协议&#xff09;&#xff1a; 六、常用选项1. -a 或 --archive2. -v 或 --verbose3. -z 或 --compress4. --delete5. --exclude6. --exclude-from…

未来娱乐新地标?气膜球幕影院的多维体验—轻空间

在中国&#xff0c;一座独特的娱乐场所正在崭露头角&#xff1a;气膜球幕影院。这个融合了气膜建筑与激光投影技术的创新场所&#xff0c;不仅令人惊叹&#xff0c;更带来了前所未有的科幻娱乐体验。让我们一起探索这个未来的娱乐空间&#xff0c;感受其中的多维魅力。 现场演出…

Linux-- 重定向缓冲区

目录 0.接上篇文章 1.粗略的见一下这两个问题 2.理解重定向 3.理解缓冲区 0.接上篇文章 Linux--基础IO&#xff08;文件描述符fd&#xff09;-CSDN博客 1.粗略的见一下这两个问题 先来了解几个函数&#xff1a; stat()函数用于获取指定文件或符号链接的元数据。如果文件是…