音视频 yuv视频格式详解(一)

引论
Yuv在流媒体领域是一个既熟悉又陌生的概念,在转码过程中需要将视频解码成yuv再重新编码以便更改一些参数, 也需要在yuv上做一些处理比如添加水印, 提升亮度,等等。之前也是使用没用重视这个格式, 但现在需要着重处理图片信息就需要深入了解yuv格式,这时候发现对yuv不了解, 这些是怎么存储的,怎么做测试, 怎么对应座标。Yuv倒底是一个什么格式呢。以此为契机, 着重看了不少文章, 形成了自己的理解, 有不对的地方望指正。
概述
Yuv是一种视频格式, 指亮度和色度分开表示的像素格式, 但这是一个笼统的提法, 它包含了很多不同的格式。本文所有的讲述都是基于8位yuv格式
定义
Yuv分为三个分量, Y 表示亮度 也就是灰度值;uv表示的是色度,描述影像的色彩及饱和度。
显示
Yuv这种格式是一种颜色编码方法, 主要用于电视系统以及模拟视频领域, 没有uv分量一样可以显示完整的图像,只不过是黑白的, 这种是有时播放yuv视频时会出现颜色的闪烁。但是yuv格式不能直接用屏幕进行渲染。手机播放器解码出yuv格式时是通过opengl将yuv格式转换成RGB格式再进行渲染。
Yuv三个主要方面
存储分类
Yuv存储方式有两大分类
1) Packed
每个像素点的y u v是连续交叉存储的, 即将yuv分量连续存储打包成一个宏像素存放在一个数组中
2) Planar
每个像素的y u v 三个分量用三个数组分别存放,也可以在一个数组中, 先连续存储所有的像素的y 紧接着存储所有像素点的u, 再是所有像素点的v 。yuv分别连续存储就像分别放在三个平面上
FOURCC码
要理解yuv格式, 必须要理解FOURCC码, 这是一个什么东东呢
FOURCC是 four character code的缩写, 用于媒体文件中的视频编解码器、压缩格式、颜色或像素格式的标识符,character大小为1byte或者8bit。所以一个FOURCC占用32bits或者4byte, bit和byte区别就不说了。代码中FOURCC是一个32位无符号整数, 由四个ASCII字符连接而成。详细在下面分类中详解。
采样
Yuv的采样有这么几种 444 、422、420 、411等, 平常最常的就是420。
444、420又是什么东西呢, 这就涉及A:B:C表示法
A:B:C表示法
因为yuv这种格式, 拿到所有y值就可以显示整幅画面,但仅是黑白的即灰度图。色度饱合度的采样率比y低, 同时又不会明显降低视觉质量, 这也就是yuv比rgb的优势所在
4:4:4
表示色度没有下采样, 每一个Y对应一组UV分量 即每一个像素都有 y u v 分量, 没有下采样, 跟rgb一样,用的较少。
在这里插入图片描述
如图, 圆圈为uv分量,叉为y分量, 它们的对应关系为一对一, 这图好多博客里有, 源自微软对yuv的官方说明, 我看这图也蒙了好久, 这是怎么存的呢, 想了好久这图跟存储没有任何关系,就是代表对应关系,如何存储就是看FOURCC和packed、planar。
4:2:2
表示2:1的水平下采样,没有竖直下采样。每条扫描线包含4个y对应2个u或者v。即每两个Y共用一组UV分量

在这里插入图片描述
4:2:0
表示2:1的水平下采样, 2:1的竖直下采样,每四个Y共用一组UV分量, 这4个y不是一条线上的4个是一个正方形的4个,
它有两种对应关系, 一种是mpeg1 一种是mpeg2
在这里插入图片描述
上图为mpeg1规定的对应方式

在这里插入图片描述
上图为mpeg2规定的对应方式

是不是觉得这两个图是什么鬼啊, 有啥子区别。等等, 别急, 这先按下, 下面对应FOURCC
类型就能懂了, 我也是想了好久。请看下一篇

Yuv重要概念
原点
(0,0)一直是在画布的左上角
跨距
画布的间距, 就是画布的宽度是多少bytes。 以原点算, 跨距是正数

对齐
画布的对齐跟根不同的显示硬件定, 但画布必须是用DWORD对齐

格式资源:
FOURCC格式说明
http://www.fourcc.org/yuv.php
微软格式说明
https://docs.microsoft.com/en-us/previous-versions/aa904813(v=vs.80)?redirectedfrom=MSDN

https://docs.microsoft.com/en-us/windows/desktop/medfound/recommended-8-bit-yuv-formats-for-video-rendering

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章