概述
直播系统的架构总体上分为采集模块、预览模块、处理模块、编码模块、推流模块。
把这五个模块串联起来就构成了整个直播系统的数据流。如下图所示:
音频采集:采集原始的PCM数据。
音频处理:对音频进行混音消除、降噪、自动增益等处理。
音频编码:把PCM格式的数据编码为AAC格式。
视频采集:相机/屏幕流的采集;YUV格式或者纹理格式。
视频处理:对视频进行美颜/滤镜等处理。
预 览: 把视频处理后的视频流在屏幕上进行渲染显示。
视频编码:把纹理或者YUV格式的原始视频流压缩成H264格式。
推 流:把AAC格式的音频流与H264格式的视频流,通过flv格式包装、推流。
模块设计
为了充分利用CPU的多核、提升推流系统的效率、低延时等,模块的设计采用多线程模型。线程之间的交互通过Blocking队列实现,由于队列是在多线程都需要操作的,需要保证队列的安全性。为了保证队列的安全性,在放入队列之前先上锁,然后操作队列。在操作队列结束之后,发出一个signal指令来告诉block住的线程继续操作队列。添加队列之后的模块图如下图所示:
音频采集
Android 端音频采集常用的有三种方案:AudioRecord、OpenSL、AAudio。
AudioRecord是Android 上层的一个API,通过它可以采集PCM格式的音频数据。
OpenSL是Native层提供的API,它可以采集或播放PCM。
详情链接: https://developer.android.google.cn/ndk/guides/audio/opensl/getting-started
AAudio 是Native层提供的API,Android O 引入的全新的音频API。
详情链接: https://developer.android.google.cn/ndk/guides/audio/aaudio/aaudio
音频的采集放到一个独立线程中执行。把采集之后的音频放到pcm队列中。这里以AudioRecord为例介绍下AudioRecord采集音频的过程:
配置参数(采样率、声道数、采样格式)并获取AudioRecord采集音频缓冲的大小
public