这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战
前面几章介绍了音频的
PCM
格式,也介绍了如何采集和播放PCM
,同时通过编码和解码加深了对音频的理解,接下来进入视频篇,来了解关于视频的相关格式、采集、编解码,以及渲染相关的知识
一、RGB
RGB
有很多种格式,比如:RGB565
、RGB555
、RGB24
、RGB32
、ARGB32
,分别表示:
-
RGB565
R
、G
、B
分别使用5位
、6位
、5位
表示,总占16位
表示,即2字节
-
RGB555
R
、G
、B
均使用5位
表示,总占16位
表示(还有一位不使用
) -
RGB24
R
、G
、B
均使用8位
表示,24
表示总占的位数,即3字节
-
RGB32
R
、G
、B
均使用8位
表示,剩下8位不用
,总占3字节
-
ARGB32
A
、R
、G
、B
均使用8位
表示,A
表示Alpha
,总占4字节
在Android
的Bitmap
中,有以下几种格式
-
Bitmap.config.ALPHA_8
该格式表示只有
Alpha
,且A
占8位
,没有其他R
、G
、B
-
Bitmap.config.RGB_565
R
、G
、B
分别使用5位
、6位
、5位
表示,总占16位
表示,即2字节
-
Bitmap.config.ARGB_4444
A
、R
、G
、B
分别使用4位
,总占16位
,即2字节
-
Bitmap.config.ARGB_8888
A
、R
、G
、B
分别使用8位
,总占32位
,即4字节
在日常开发中,接触的比较多的格式是RGB565
、RGB32
,下面以RGB32
为例,讲解相关存储格式
1.1 简单图示
对于一副图片,我们可以将其看做是由一个个的像素点组成,而每个像素点中,由R
、G
、B
三个元素组成,对于RGB32
,则三个元素分别占8位
(还有8位未使用
),总的32位
,即4字节
从上图可以看到,存储的顺序是B->G->R->保留
如果是ARGB32
,则保留的8位
会用来表示Alpha
二、YUV
简单介绍完了RGB
格式,接下来介绍图像的另一种格式YUV
YUV
不同于RGB
,其中Y
、U
、V
表示:
Y
:表示亮度U、V
:表示色度
Y
、U
、V
分别占用8位
2.1 采样格式
根据采样方式,YUV
分为很多种格式,比如YUV444
、YUV422
、YUV420
等
YUV444
每个Y
,都有一组U、V
对应
YUV422
每两个Y
,共用一组U、V
YUV420
每四个Y
,共用一组U、V
在开发中,我们比较常用到的是YUV420
,这个格式的占用资源少
2.2 存储格式
按照存储格式,又可以将YUV
分为packed
、planar
,对于planar
,还有一种SemiPlanar
格式
-
packed
:将
YUV
看做一个整体,就像RGB
一样,然后交错存储
-
planar
:分别将
Y
、U
、V
看做一个整体,先存完一个分量,再存另一个,比如:先将Y
分量存入,再存入U
,最后存入V
-
SemiPlanar
:该格式是先将
Y
存储,然后将UV
看做一个整体交错存储
下面主要介绍planar
和SemiPlanar
格式
YUV420p
即YUV420planar
在开发中,经常会遇到该格式,常见的有YV12
、YV21
-
YV21
(I420
)Y
先存储,接着U
在前,V
在后分别存储
-
YV12
Y
先存储,接着V
在前,U
在后分别存储
YUV420sp
对于YUV420sp
,在开发中也是比较常见的,比如NV21
、NV12
-
NV21
先存储
Y
,然后V
在前U
在后交错存储
-
NV12
先存储
Y
,然后U
在前V
在后交错存储
对于YUV420sp
,音视频开发中比较常见的是
- 在
Camera
的预览回调时,可以设置其回调图像格式为NV21
- 在
MediaCodec
编码时,可以设置其图像格式为NV12
所有我们在使用MediaCodec
编码视频时,需要将预览回调的NV21
数据,转换成NV12
,这样才能正常编码视频
关于如何转换,后面在视频编码的章节会介绍到。