这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战
前面几章介绍了音频的
PCM格式,也介绍了如何采集和播放PCM,同时通过编码和解码加深了对音频的理解,接下来进入视频篇,来了解关于视频的相关格式、采集、编解码,以及渲染相关的知识
一、RGB
RGB有很多种格式,比如:RGB565、RGB555、RGB24、RGB32、ARGB32,分别表示:
-
RGB565R、G、B分别使用5位、6位、5位表示,总占16位表示,即2字节 -
RGB555R、G、B均使用5位表示,总占16位表示(还有一位不使用) -
RGB24R、G、B均使用8位表示,24表示总占的位数,即3字节 -
RGB32R、G、B均使用8位表示,剩下8位不用,总占3字节 -
ARGB32A、R、G、B均使用8位表示,A表示Alpha,总占4字节
在Android的Bitmap中,有以下几种格式
-
Bitmap.config.ALPHA_8该格式表示只有
Alpha,且A占8位,没有其他R、G、B -
Bitmap.config.RGB_565R、G、B分别使用5位、6位、5位表示,总占16位表示,即2字节 -
Bitmap.config.ARGB_4444A、R、G、B分别使用4位,总占16位,即2字节 -
Bitmap.config.ARGB_8888A、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在后分别存储
-
YV12Y先存储,接着V在前,U在后分别存储
YUV420sp
对于YUV420sp,在开发中也是比较常见的,比如NV21、NV12
-
NV21先存储
Y,然后V在前U在后交错存储
-
NV12先存储
Y,然后U在前V在后交错存储
对于YUV420sp,音视频开发中比较常见的是
- 在
Camera的预览回调时,可以设置其回调图像格式为NV21 - 在
MediaCodec编码时,可以设置其图像格式为NV12
所有我们在使用MediaCodec编码视频时,需要将预览回调的NV21数据,转换成NV12,这样才能正常编码视频
关于如何转换,后面在视频编码的章节会介绍到。