声音的渲染在iOS平台上会直接使用AudioUnit(AUGraph)
之类的API接口,Android平台则使用 OpenSL ES或者AudioTrack这两类接口。而对于视频画面的渲染,笔者会为大家介绍一种跨平台的渲染技术,即OpenGL ES
。
一 AudioUnit介绍与实践
在iOS平台上,所有的音频框架底层都是基于AudioUnit
实现的。较高层次的音频框架包括:Media Player
、AV Foundation
、OpenAL
和Audio Toolbox
,这些框架都封装了AudioUnit
,然后提供了更高层次的API(功能更少,职责更单一的接口)。
1.1 认识AudioSession
音频会话(AudioSession
), 其用于管理与获取iOS设备音频的硬件信息,并且是以单例的形式存在。
1.2 构建AudioUnit
在创建并启用音频会话之后,就可以构建AudioUnit了。构建 AudioUnit的时候需要指定类型(Type)
、子类型(subtype)
以及厂商 (Manufacture)
。
那么如何使用这个描述来构造真正的AudioUnit
呢?有两种方式。
- 裸创建方式
- AUGraph创建方式
1.3 AudioUnit的通用参数设置
输入端一般是指麦克风,输出端一般是指扬声器(Speaker)或者耳机。
1.4 AudioUnit的分类
-
Effect Unit
类型是kAudioUnitType_Effect,主要提供声音特效处理的功能。 -
Mixer Units
类型是kAudioUnitType_Mixer,主要提供Mix多路声音的功能。 -
I/O Units
类型是kAudioUnitType_Output,它的用途就像其分类的名字一样,主要提供的就是I/O的功能。 -
Format Converter Units
类型是kAudioUnitType_FormatConverter,主要用于提供格式转换的功能。 -
Generator Units
类型是kAudioUnitType_Generator,在开发中我们经常使用它来提供播放器的功能。
1.5 构造一个AUGraph
AUGraph
的方式将声音采集、声音处理以及声音输出的整个过程管理起来。
二 视频渲染
2.1 OpenGL ES 介绍
OpenGL(Open Graphics Library)定义了一个跨编程语言、跨平台 编程的专业图形程序接口。
在iOS平台上使用EAGL
提供本地平台对OpenGL ES
的实现。
OpenGL
主要是做图形图像处理的库,尤其是在移动设备上进行图形图像处理,它的性能优势更能体现出来。
GLSL
(OpenGL Shading Language)是OpenGL的着色器语言。
2.2 OpenGL ES的实践
而在显卡中,这些像素点可以组织成帧缓冲区
(FrameBuffer)的形式,帧缓冲区保存了图形硬件为了控制屏幕上所有像素的颜色和强度所需要的全部信息。
渲染管线分为以下几个阶段。
- 阶段一 指定几何对象
- 阶段二 顶点处理
- 阶段三 图元组装
- 阶段四 栅格化操作
- 阶段五 片元处理
- 阶段六 帧缓冲操作
glFinish和glFlush
因此每次写完绘图代码,需要让其 立即完成效果时,开发者都需要在代码后面添加glFlush()或 glFinish()函数。
2.3 上下文环境搭建
EGL
是双
缓冲的工作模式,即有一个Back Frame Buffer
和一个Front Frame Buffer
。
iOS平台不允许直接渲染到屏幕上,因此要使用renderBuffer
来代替。
在iOS平台上不允许开发者使用OpenGL ES
直接渲染屏幕,必须使 用FrameBuffer
与RenderBuffer
来进行渲染。
若要使用EAGL
,则必须先创建一个RenderBuffer
,然后让OpenGL ES
渲染到该RenderBuffer
上去。 而该RenderBuffer
则需要绑定到一个CAEAGLLayer
上面去,这样开发者 最后调用EAGLContext
的presentRenderBuffer
方法,就可以将渲染结果输出到屏幕
上去了。
实际上,在调用这个方法时,EAGL
也会执行类似于前面的swapBuffer
过程,将OpenGL ES
渲染的结果绘制到物理屏幕上去(View
的Layer
)。
2.4 OpenGL ES中的纹理
OpenGL
中的纹理可以用来表示图像、照片、视频画面等数据。
但是在OpenGL ES
的操作过程中必须告诉OpenGL ES
具体操作的是哪一个纹理对象。
一般在视频的渲染与处理的时候使用GL_LINEAR
这种过滤方式。
OpenGL
的大部分纹理一般都只接受RGBA
类型的数据,所以我们需要对PNG
这种压缩格式进行解码操作。
本文参考音视频开发进阶指南