最近没事情做,就想着研究一下Android比较贴近硬件的部分。之前在一家音视频即时通讯公司一直对音视频感兴趣,所以就研究一下Android端的音视频通讯。
这篇文章记录一下怎么从安卓摄像头获取最原始的 YUV420 视频流、
首先,我们了解一下什么是‘YUV’
这里引用一段文字:
YUV是被欧洲电视系统所采用的一种颜色编码方法,
亮度信号Y和两个色差信号U、V
其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
那么,YUV的模型是什么样的呢?如图所示:
每个Y,就是一个像素,每个Y的取值范围是 [0-255],那么这张图表示的意思就是,一个像素为 宽8像素 高4像素的图形块。 这里分成两块,上面一块,下面一块,上面一块全是Y,下面一块,则是UV的排列
这里我们看一下颜色的分布, Y1,Y2,Y9,Y10 是深红色,那么这四个像素对应的颜色(U,V)则是 (U1 , V1)
YUV 先把Y像素的明亮度写完,再在结尾追加每块的颜色以及饱和度。
这就是黑白电视与彩色电视的区别,如果单独只读取Y值,那么呈现的就是黑白电视的效果,如果读取Y值,并且结合结尾的UV两个属性一起渲染,那么呈现的就是彩色电视的效果。
这里给两张图来做对比:
这两张都是我自己读取的数据,第一张是黑白的,第二张则是彩色的。