音视频开发之Android硬件解封装

硬件解封装

Android平台针对音视频封装提供了MediaMuxer API,支持.mp4格式的封装;针对解封装提供了MediaExtractor API,支持.mp4等格式。

API架构

frameworks/base/media 文件夹中提供了所有音视频相关的Java层API,本文中讲述的解封装API都定义在该处。而具体的服务实现都在 frameworks/av 文件夹中

android_muxer_demuxer

自7.0开始,MediaService被拆分成多个服务,每个服务都运行在各自的进程中。

MediaExtractor 解封装

MediaExtractor类是官方提供的音视频解封装类。其官方使用Demo如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 创建解封装器 
MediaExtractor extractor = new MediaExtractor();
// 设置数据源
extractor.setDataSource(...);
// 遍历所有轨道
int numTracks = extractor.getTrackCount();
for (int i = 0; i < numTracks; ++i) {
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
// 根据轨道类型选择想要的轨道
if (weAreInterestedInThisTrack) {
extractor.selectTrack(i);
}
}
ByteBuffer inputBuffer = ByteBuffer.allocate(...)
// 读取选中轨道的样本数据
while (extractor.readSampleData(inputBuffer, ...) >= 0) {
int trackIndex = extractor.getSampleTrackIndex();
long presentationTimeUs = extractor.getSampleTime();
...
// 下一个样本
extractor.advance();
}
extractor.release();
extractor = null;

支持的格式

android_muxer_demuxer

注册解封装器

MediaExtractorService被创建的时候,会注册所有的Extractor实现。

音视频开发之基础篇

前言

系列文章

一、Android硬件编解码与解封装

  1. 音视频开发之基础篇
  2. 音视频开发之Android硬件解封装
  3. 音视频开发之Android硬件编解码
  4. 音视频开发之音视频同步
  5. 音视频开发之相机录制功能(硬编)
  6. 音视频开发之视频播放功能(硬解)

二、FFmpeg软件编解码与解封装

  1. 音视频开发之FFmpeg基础篇
  2. 音视频开发之FFmpeg解封装
  3. 音视频开发之FFmpeg编解码
  4. 音视频开发之相机录制功能(软编)
  5. 音视频开发之视频播放功能(软解)

三、OpenGL-ES渲染视频与特效

  1. OpenGL-ES基础篇
  2. OpenGL-ES纹理
  3. OpenGL-ES渲染视频
  4. FBO数据缓冲区
  5. 视频特效

四、OpenSL-ES音频播放与SoundTouch音频处理

  1. OpenSL-ES基础篇
  2. OpenSL-ES播放音频
  3. SoundTouch基础篇
  4. 音频特效

五、直播推流与拉流

  1. WebRTC基础篇

本篇重点

音视频基础概念与相关术语的讲解

什么是视频?

图像的组成

在说视频之前,我们来聊一下图像,图像是人对视觉感知的物质再现。图像是使用像素点阵来表示的,每个像素点都分配有特定的颜色和位置值。像素也是图像显示的基本单位,通常一幅1080x1920的图片,就是长度1920个像素点,宽度1080个像素点组成的矩阵。

颜色空间

像素点除了有位置外还需要有颜色信息,那么颜色在计算机中是如何表示呢?

在计算机中颜色空间有很多,这里我们介绍下常用的两种颜色空间,RGB颜色空间和YUV颜色空间。

RGB颜色空间

RGB颜色空间是由红绿蓝三原色来定义,通过三原色混合成所有的颜色,这应该是我们最熟悉的一种颜色空间。

YUV颜色空间

Y表示亮度,U和V表示色度和浓度。早期的YUV实际上是用在彩色电视和黑白电视的交替上,感兴趣历史的同学可以点击YUV查看相关资料。YUV颜色空间在数字媒体中广泛使用是由于人类对亮度的的敏感度高于对色度的敏感度,但是在数字媒体中使用的是个变体,叫YCbCr,其中Cb是指蓝色色度,Cr就是红色色度。像JPEG、MPEG都是采用此格式,后续一般讲的YUV都是指YCbCr。(Y的值是根据RGB值计算出来的,所以Cg的值可以通过CbCr计算出来,所以在传输的时候只需要传输YCbCr)

1
2
3
4
5
计算公式: 
Y = KrR+KgG+Kb*B(k为权重值,ITU-R推荐的BT.601中定义Kb=0.114,Kr=0.299,Kb+Kr+Kg=1)
Cb=B-Y
Cr=R-Y
Cg=G-Y

YCbCr会按照一定的采样比对色度数据进行采样,采样比通常表示为 J​ : a : ​b,表示在一个宽为J像素、高为2像素的采样区域中进行采样,J表示采样的宽度,通常是4,a表示第一行色度采样数,b表示第二行色度采样数与第一行色度采样的不同样点数。

YCbCr采样比

最常见的采样比是 4:2:0 ,表示宽为4,第一行有两个色度采样点,第二行与第一行完全相同。所以总共有八个亮度采样点和两个色度采样点,每个亮度采样点需要记录一个值Y,而每个色度采样点都需要记录两个值Cb和Cr。最终需要记录的值为 8Y+2Cr+2Cb = 12,而如果使用RGB来记录则会需要3x8=24。

YCbCr的优势就在于,在达到最大压缩率的情况下,能够保证对人眼感知的失真度最小。拿4:2:0来说足足压缩了一半。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×