Android 音视频开发【视频篇】【一】RGB、YUV格式 | 8月更文挑战

1,322 阅读3分钟

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

前面几章介绍了音频的PCM格式,也介绍了如何采集和播放PCM,同时通过编码和解码加深了对音频的理解,接下来进入视频篇,来了解关于视频的相关格式、采集、编解码,以及渲染相关的知识

一、RGB

RGB有很多种格式,比如:RGB565RGB555RGB24RGB32ARGB32,分别表示:

  • RGB565

    RGB分别使用5位6位5位表示,总占16位表示,即2字节

  • RGB555

    RGB均使用5位表示,总占16位表示(还有一位不使用

  • RGB24

    RGB均使用8位表示,24表示总占的位数,即3字节

  • RGB32

    RGB均使用8位表示,剩下8位不用,总占3字节

  • ARGB32

    ARGB均使用8位表示,A表示Alpha,总占4字节

AndroidBitmap中,有以下几种格式

  • Bitmap.config.ALPHA_8

    该格式表示只有Alpha,且A8位,没有其他RGB

  • Bitmap.config.RGB_565

    RGB分别使用5位6位5位表示,总占16位表示,即2字节

  • Bitmap.config.ARGB_4444

    ARGB分别使用4位,总占16位,即2字节

  • Bitmap.config.ARGB_8888

    ARGB分别使用8位,总占32位,即4字节

在日常开发中,接触的比较多的格式是RGB565RGB32,下面以RGB32为例,讲解相关存储格式

1.1 简单图示

RGB.png

对于一副图片,我们可以将其看做是由一个个的像素点组成,而每个像素点中,由RGB三个元素组成,对于RGB32,则三个元素分别占8位(还有8位未使用),总的32位,即4字节

RGB存储格式.png

从上图可以看到,存储的顺序是B->G->R->保留

如果是ARGB32,则保留的8位会用来表示Alpha

二、YUV

简单介绍完了RGB格式,接下来介绍图像的另一种格式YUV

YUV不同于RGB,其中YUV表示:

  • Y:表示亮度
  • U、V:表示色度

YUV分别占用8位

2.1 采样格式

根据采样方式,YUV分为很多种格式,比如YUV444YUV422YUV420

YUV444

每个Y,都有一组U、V对应

YUV444.png

YUV422

两个Y,共用一组U、V

YUV422.jpg

YUV420

四个Y,共用一组U、V

YUV420.jpg

在开发中,我们比较常用到的是YUV420,这个格式的占用资源少

2.2 存储格式

按照存储格式,又可以将YUV分为packedplanar,对于planar,还有一种SemiPlanar格式

  • packed

    YUV看做一个整体,就像RGB一样,然后交错存储

  • planar

    分别将YUV看做一个整体,先存完一个分量,再存另一个,比如:先将Y分量存入,再存入U,最后存入V

  • SemiPlanar

    该格式是先将Y存储,然后将UV看做一个整体交错存储

下面主要介绍planarSemiPlanar格式

YUV420p

YUV420planar

在开发中,经常会遇到该格式,常见的有YV12YV21

  1. YV21I420

    Y先存储,接着U在前,V在后分别存储

YV21.png

  1. YV12

    Y先存储,接着V在前,U在后分别存储

YV12.png

YUV420sp

对于YUV420sp,在开发中也是比较常见的,比如NV21NV12

  1. NV21

    先存储Y,然后V在前U在后交错存储

NV21.png

  1. NV12

    先存储Y,然后U在前V在后交错存储

NV12.png

对于YUV420sp,音视频开发中比较常见的是

  • Camera的预览回调时,可以设置其回调图像格式为NV21
  • MediaCodec编码时,可以设置其图像格式为NV12

所有我们在使用MediaCodec编码视频时,需要将预览回调的NV21数据,转换成NV12,这样才能正常编码视频

关于如何转换,后面在视频编码的章节会介绍到。