264 解码之 yuv

博客访问量日渐减少,于是我决定丢一点技术东东上去,吸引爬虫光顾一下。

先谈谈 h.264 的编解码问题。
个人建议做视频、音频的孩子们,一定要抓住 RFC 和 standard ,然后多看开源编解码程序。
近来抽空看了两个 decoder ,一个是从 ffmpeg 里面抽取出来的 h.264 部分,还有从 JM 。

解码器生成最后结果是 yuv420 格式(后面会提到)。
关于 yuv ,看到论坛里不少人都急于找工具去看自己解得一帧图像是否正确,更有不少人提供 yuv420 2 rgb24 和 yuv422 2 rgb24 等代码。
这里建议使用 强大的 ps 的 .raw 文件的功能。
.raw 文件可用来查看 纯 rgb 图片 和 纯 yuv 图片,很适合做图像。

yuv 格式:
YUV是指亮度参量和色度参量分开表示的像素格式,而这样分开的好处就是不但可以避免相互干扰,还可以降低色度的采样率而不会对图像质量影响太大。YUV 是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格式。
YUV格式通常有两大类:打包(packed)格式和平面(planar)格式。前者将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像 素(macro-pixel);而后者使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。
YUY2到Y211都是打包格式,而IF09到YVU9都是平面格式。
(注意:在介绍各种具体格式时,YUV各分量都会带有下标,如Y0、 U0、V0表示第一个像素的YUV分量,Y1、U1、V1表示第二个像素的YUV分量,以此类推。)

MEDIASUBTYPE_YUY2 YUY2格式,以4:2:2方式打包
MEDIASUBTYPE_YUYV YUYV格式(实际格式与YUY2相同)
MEDIASUBTYPE_YVYU YVYU格式,以4:2:2方式打包
MEDIASUBTYPE_UYVY UYVY格式,以4:2:2方式打包
MEDIASUBTYPE_AYUV 带Alpha通道的4:4:4 YUV格式
MEDIASUBTYPE_Y41P Y41P格式,以4:1:1方式打包
MEDIASUBTYPE_Y411 Y411格式(实际格式与Y41P相同)
MEDIASUBTYPE_Y211 Y211格式
MEDIASUBTYPE_IF09 IF09格式
MEDIASUBTYPE_IYUV IYUV格式
MEDIASUBTYPE_YV12 YV12格式
MEDIASUBTYPE_YVU9 YVU9格式
yuv采样:

4:4:4 表示色度频道没有下采样。每像素 24 位

4:2:2 表示 2:1 的水平下采样,没有垂直下采样。对于每两个 U 样例或 V 样例,每个扫描行都包含四个 Y 样例。每像素 16 位

4:2:0 表示 2:1 的水平下采样,2:1 的垂直下采样。每像素 16 位

4:1:1 表示 4:1 的水平下采样,没有垂直下采样。对于每个 U 样例或 V 样例,每个扫描行都包含四个 Y 样例。与其他格式相比,4:1:1 采样不太常用,本文不对其进行详细讨论。每像素 16 位



在我做的 h264 中,支 持420的连续或隔行视频的编码和解码。
其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用 是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是通过RGB输入信号来创建的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的 两个方面—色调与饱和度,分别用Cr和CB来表示。其中,Cr反映了GB输入信号红色部分与RGB信号亮度值之间的差异。而CB反映的是RGB输入信号蓝 色部分与RGB信号亮度值之同的差异。 
YUV色彩模型来源于RGB模型,
该模型的特点是将亮度和色度分离开,从而适合于图像处理领域。
应用:模拟领域
Y'= 0.299*R' + 0.587*G' + 0.114*B'
U'= -0.147*R' - 0.289*G' + 0.436*B' = 0.492*(B'- Y')
V'= 0.615*R' - 0.515*G' - 0.100*B' = 0.877*(R'- Y')


R' = Y' + 1.140*V'
G' = Y' - 0.394*U' - 0.581*V'
B' = Y' + 2.032*U'
YCbCr模型来源于YUV模型。YCbCr是 YUV 颜色空间的偏移版本.
应用:数字视频,ITU-R BT.601建议
Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16
Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128
Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128
R' = 1.164*(Y’-16) + 1.596*(Cr'-128)
G' = 1.164*(Y’-16) - 0.813*(Cr'-128) - 0.392*(Cb'-128)
B' = 1.164*(Y’-16) + 2.017*(Cb'-128)
PS: 上面各个符号都带了一撇,表示该符号在原值基础上进行了伽马校正,伽马校正有助于弥补在抗锯齿的过程中,线性分配伽马值所带来的细节损失,使图像细节更加 丰富。在没有采用伽马校正的情况下,暗部细节不容易显现出来,而采用了这一图像增强技术以后,图像的层次更加明晰了。
所以说H264里面的YUV应属于YCbCr.

常见H264测试的YUV序列:

CIF图像大小的YUV序列(352*288),在文件 开始并没有文件头,直接就是YUV数据,先存第一帧的Y信息,长度为352*288个byte, 然后是第一帧U信息长度是352*288/4个byte, 最后是第一帧的V信息,长度是352*288/4个byte, 因此可以算出第一帧数据总长度是352*288*1.5,即152064个byte, 如果这个序列是300帧的话, 那么序列总长度即为152064*300=44550KB,这也就是为什么常见的300帧CIF序列总是44M的原因.

Y41P(和Y411)(packed格式)格式为每个像素保留Y分量,而UV分量在 水平方向上每4个像素采样一次。一个宏像素为12个字节,实际表示8个像素。图像数据中YUV分量排列顺序如下: U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y8 …

IYUV格式(planar)为每个像素都提取Y分量,而在UV分量的提取时,首先将 图像分成若干个2 x 2的宏块,然后每个宏块提取一个U分量和一个V分量。YV12格式与 IYUV类似,但仍然是平面模式。


YUV411、YUV420格式多见于DV数据中。
YUV411用于NTSC制。为每个像素都提取Y分量,而UV分量在水平方向上每4个像素采样一次。
YUV420用于 PAL制。并非V分量采样为0,而是跟YUV411相比, 在水平方向上提高一倍色差采样频率,在垂直方向上以U/V间隔的方式减小一半色差采样。

各种格式的具体使用位数的需求(使用4:2:0采样,对于每个元素用8个位大小表示):

格式: Sub-QCIF 亮度分辨率: 128*96   每帧使用的位: 147456
格式: QCIF   亮度分辨率: 176*144   每帧使用的位: 304128
格式: CIF   亮度分辨率: 352*288   每帧使用的位: 1216512
格 式: 4CIF   亮度分辨率: 704*576   每帧使用的位: 4866048

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

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

相关文章

Java笔记12-函数式接口

主要内容 自定义函数式接口函数式编程常用函数式接口 第一章 函数式接口 概念 函数式接口在java中指的是:有且只有一个抽象方法的接口 函数式接口,即适用于函数式编程场景的接口.而java中共的函数式编程体现就是Lambda,所以函数式接口就是可以适用于lambda使用的接口.只有…

雷军晒3亿估值,意欲“收编”台湾硬件创业者?

1月13日,在台湾的CSMIC 2015移动互联网两岸年会上,雷军以猎豹移动董事长的身份做了《给年轻创业者的两大方向性建议》演讲。 演讲中雷军表示,“在未来5到10年,特别适合台湾年轻创业者做的两个方向,一个是移动互联网&am…

网页“console”输出图文信息

http://www.monmonkey.com/javascript/jiben2.html 参考以上链接中的转义字符使用。 http://www.cnblogs.com/Wayou/p/chrome_dev_tool_style_console.html https://segmentfault.com/a/1190000002511877 以上链接里有各种 console 输出 ASCII图文的实现方法。 ASCII图文动态效…

记事本安卓软件代码设计_用轻量级工具 Notepad3 替代 36 岁的微软记事本

一不小心,微软记事本发布 36 年了。虽然微软记事本自 1985 年 Windows 1.0 以来已包含在所有版本的 Microsoft Windows 中,但它太基础了,以至于几乎所有人都要替代它,比如轻量级的 Notepad3,支持代码高亮/折叠、括号匹…

H.264编码技术

H.264基本概况随着HDTV的兴起,H.264这个规范频频出现在我们眼前,HD-DVD和蓝光DVD均计划采用这一标准进行节目制作。而且自2005年下半年以来,无论是NVIDIA还是ATI都把支持H.264硬件解码加速作为自己最值得夸耀的视频技术。H.264到底是何方“神…

Java笔记13-兄弟连在线考试系统

今天内容: 1.兄弟连在线考试系统 1.1 软件开发的流程 需求分析文档 > 概要设计文档 > 详细设计文档 > 编码和测试1.2 编写目的 (1)复习JavaSE所学的所有内容。 (2)锻炼基本的编程能力。 1.3 功能分析 考试系统:(1)学员系统a.修改密码b.开始…

macOS自带Python2.7删除之后的悲剧

2019独角兽企业重金招聘Python工程师标准>>> 起因 今天打开xcode想要开始继续写项目的时候悲剧了. Loading a plug-in failed. The plug-in or one of its prerequisite plug-ins may be missing or damaged and may need to be reinstalled. 尝试用终端打开看看报…

EasyUI 表格点击右键添加或刷新 绑定右键菜单

例1 在HTML页面中设置一个隐藏的菜单&#xff08;前提是已经使用封装的Easyui&#xff09; 代码&#xff1a; <div id"contextMenu_jygl" class"easyui-menu" style"width: 80px; display: none;"> <div …

python神奇的小海龟_Python笔记_第一篇_面向过程_第一部分_8.画图工具(小海龟turtle)...

turtle 是一个简单的绘图工具。提供一个小海龟&#xff0c;可以把它理解为一个机器人&#xff0c;只能听懂有限的命令&#xff0c;且绘图窗口的原点(0,0)在中间&#xff0c;默认海龟的方向是右侧海龟的命令包括三类&#xff1a;运动命令、笔画控制命令、其他命令。1. 运动命令…

jupyter浅析

一、jupyter 起步:简介 Jupyter Notebook是一个开源的Web应用程序&#xff0c;允许用户创建和共享包含代码、方程式、可视化和文本的文档。它的用途包括&#xff1a;数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等等。它具有以下优势&#xff1a; 可选择语言&a…

我在全球最大的同性社交平台那点事

本文作者&#xff1a;夏之冰雪&#xff0c;i春秋签约作家 《我在百度网盘上看到上万条车主个人信息,企业、政府高官信息、各种数据库和无穷无尽的盗版》&#xff0c;一时间&#xff0c;这篇文章就火了&#xff0c;火爆程度另百度猝不及防。 其实呢&#xff0c;这事真不能全怪百…

H.264的CAVLC(编码.解码)过程详解

看264也看到CAVLC来了&#xff0c;把这方面的资料贴在这里&#xff1a; 编码过程&#xff1a; 假设有一个4*4数据块 &#xff08;变化&#xff0c;量化后就送入熵编码&#xff09;{ 0 , 3 , -1 , 0, 0, -1 , 1, 0, 1 , 0 , 0 , 0, 0 , 0 , 0 , 0 } 数据重排列&a…

python进程通信方式有几种_python全栈开发基础【第二十一篇】互斥锁以及进程之间的三种通信方式(IPC)以及生产者个消费者模型...

一、互斥锁进程之间数据隔离&#xff0c;但是共享一套文件系统&#xff0c;因而可以通过文件来实现进程直接的通信&#xff0c;但问题是必须自己加锁处理。注意&#xff1a;加锁的目的是为了保证多个进程修改同一块数据时&#xff0c;同一时间只能有一个修改&#xff0c;即串行…

Python实现修改图片尺寸

起步 很多小伙伴从网上找的图片可能图片尺寸与自己的需求不符合 今天小编就教大家使用python写一个简单脚本程序实现修改图片的尺寸 环境准备 首先我们需要python环境,它的安装可以参考:python安装以及版本检测 其次我们还需要安装一个python图形化的库PIL PIL的安装,这里…

数据集

https://zhuanlan.zhihu.com/p/25138563转载于:https://www.cnblogs.com/zhangbojiangfeng/p/7039725.html

常见的攻击手段及其防御方式

本文简单介绍几种常见的攻击手段及其防御方式 XSS(跨站脚本攻击)CSRF&#xff08;跨站请求伪造&#xff09;SQL注入DDOSXSS 概念 全称是跨站脚本攻击&#xff08;Cross Site Scripting&#xff09;&#xff0c;指攻击者在网页中嵌入恶意脚本程序。案列 比如说我写了一个博客网站…

使用ffmpeg进行h.264编码

m_fmt->video_codec CODEC_ID_H264; /* 添加视频流 */ m_video_st av_new_stream(m_oc, 0); if (!m_video_st) { return 0; } m_videocavcodec_alloc_context(); m_videoc m_video_st->codec; /* 视频相关参数 */ m_videoc->codec_id m_fmt->video_codec; m_…

关于java的关键字 transient

我们都知道一个对象只要实现了Serilizable接口&#xff0c;这个对象就可以被序列化&#xff0c;Java的这种序列化模式为开发者提供了很多便利&#xff0c;我们可以不必关系具体序列化的过程&#xff0c;只要这个类实现了Serilizable接口&#xff0c;这个的所有属性和方法都会自…

python中文件变化监控-watchdog

起步 在python中文件监控主要有两个库&#xff0c;一个是pyinotify&#xff0c;一个是watchdog。pyinotify依赖于Linux平台的inotify&#xff0c;后者则对不同平台的的事件都进行了封装。因为我主要用于Windows平台&#xff0c;所以下面着重介绍watchdog&#xff08;推荐大家阅…

python决策树分类鸢尾花_基于决策树—鸢尾花分类

决策树算法广泛应用于&#xff1a;语音识别、医疗诊断、客户关系管理、模式识别、专家系统等&#xff0c;在实际工作中&#xff0c;必须根据数据类型的特点及数据集的大小&#xff0c;选择合适的算法。本文选择经典案例——《鸢尾花分类》一、决策树定义决策树算法是一种基于实…