Skip to content
buliaoyin edited this page Nov 22, 2017 · 19 revisions

UnionMobileStreaming_Android

CDN联盟Android端推流SDK使用模块化的方式构建,可以灵活的接入各种自定义模块。
当前工程给出了自定义librtmp推流模块,fdk-aac音频编码模块,x264视频编码模块的集成示例。

运行前请执行:

./build.sh

1. 运行环境

  • 最低支持版本为Android 4.4 (API level 19)

  • 支持的CPU架构:armv7, arm64, x86

2. 工程结构

demo

目录包含SDK的使用示例,以及串联各个功能模块的kit类 UnionStreamer.java .

prebuilt

目录包含SDK框架及基础功能的jar/so文件,是其他各个模块的基础。

libunionstreamer

目录在执行./build.sh后, 会将prebuilt中的基础jar/so拷贝到自己的libs目录下,作为其他模块的依赖模块。

fdkaacencoder

目录包含了自定义fdk-aac编码库的代码示例。

x264encoder

目录包含了自定义x264编码库的代码示例。

librtmppub

包含了自定义RTMP推流模块的代码示例。

docs

目录下为libunionstreamer基础库的javadoc文档, 也可以直接通过 GitHub Pages 访问。

3. SDK框架说明

3.1. 关键结构说明

  • SrcPin: 产出数据的Pin, 定义为泛型, 需配合数据结构类型使用

  • SinkPin: 消耗数据的Pin, 定义为泛型, 需配合数据结构类型使用

  • AVConst: 定义SDK中用到的一些音视频常量

  • ImgTexFrame: GPU图像帧的定义,包含了图像的格式及textureid等信息

  • ImgBufFrame: 使用ByteBuffer存储的RAW图像帧的定义,包含RGBA/YUV等格式的图像

  • AudioBufFrame: PCM音频数据的定义

  • ImgPacket: 编码后的视频帧格式定义

  • AudioPacket: 编码后的音频帧格式定义

3.2. 使用Pin来连接各个模块

该部分主要用来说明SDK内部各个模块之间连接方式以及数据流的传送机制。

在搭建推流Pipeline的时候,各个模块之间的连接使用 SrcPinSinkPin 来完成。

  • 一个Module包含若干个Pin, Module之间的连接由Pin来实现

  • Pin包含 SrcPinSinkPin, 分别产生和消耗数据流

  • SrcPinSinkPin 均是泛型类,创建时需要指定数据格式,相同数据格式的Pin才可以连接,例如:

    • SrcPin<ImgTexFrame> → SinkPin<ImgTexFrame>

    • SrcPin<ImgBufFrame> → SinkPin<ImgBufFrame>

    • SrcPin<AudioBufFrame> → SinkPin<AudioBufFrame>

    • SrcPin<ImgPacket> → SinkPin<ImgPacket>

    • SrcPin<AudioPacket> → SinkPin<AudioPacket>

  • 一个SrcPin可以连接多个SinkPin, 一个SinkPin只能跟一个SrcPin连接;

  • 所有连接或断开连接的操作均由SrcPin端操作;

3.2.1. Pin的相关操作

  • 调用SrcPin的connect接口连接两个模块

    public void connect(SinkPin<T> sinkPin)
  • 调用SrcPin的disconnect接口断开连接

    // 断开所有已连接的SinkPin, recursive为true时表示需要递归断开后面所有已连接的模块
    public void disconnect (boolean recursive)
    // 断开指定的某个已连接的SinkPin,recursive为true时表示需要递归断开后面所有已连接的模块
    public void disconnect (SinkPin<T> sinkPin, boolean recursive)

    SrcPin调用disconnect后,SinkPin端可以收到onDisconnect事件

    // 源端已断开连接,recursive为true时需要release当前模块,并递归断开后面所有已连接的模块
    public abstract void onDisconnect (boolean recursive)
  • 处理onFormatChanged

    该接口表示数据的初始化完成以及数据格式的改变,源端数据初始化完成及发生改变时均需要触发改事件, Sink端一般需要在该回调中进行一些初始化的工作。

    • 包含SrcPin的模块需要在合适的时机触发onFormatChanged;

    • 包含SinkPin的模块需要根据需要处理SrcPin触发的onFormatChanged事件;

  • 处理onFrameAvailable

    • 包含SrcPin的模块需要在新的一帧数据ready时触发onFrameAvailable;

    • 包含SinkPin的模块在onFrameAvailable中可以获取新的一帧数据;

3.3. 各主要模块介绍

SDK内部主要实现了音视频的采集、处理、预览、编码和推流功能,下面将对应SDK中的类名进行说明。

3.3.1. 采集模块

CameraCapture

摄像头采集模块,封装了对手机Camera的相关操作,将采集到的图像输出为针对GPU的ImgTexFrame,和针对cpu的ImgBufFrame。

ViewCapture

View采集模块,可以将通用的Android View以配置的fps采集输出为针对GPU的ImgTexFrame.

WaterMarkCapture

水印数据生成模块,生成logo图片以及时间戳的ImgTexFrame和ImgBufFrame数据。

AudioCapture

麦克风采集模块,包含普通的AudioRecord采集,针对低延迟音频的OpenSLES采集,以及不占用mic,仅输出静音数据的Dummy采集方式。

3.3.2. 图像处理

如下列举了软编、硬编模式下基于GPU图像处理的相关模块.

ImgTexFilterMgt

美颜滤镜的管理类,封装了美颜模块的动态替换操作。

ImgTexFilterBase

GPU Filter的基类,封装了SrcPin及SinkPin的相关操作,以及FBO的创建及复用逻辑。开发者如需自定义美颜滤镜,可以继承该基类来实现。

ImgTexScaleFilter

该模块完成Camera所采集数据的crop、scale、rotate及颜色空间转换。

ImgBeautyXXXFilter

各种内置美颜滤镜的实现类。

ImgTexMixer

基于GPU实现的图像混合类。可以接受最多8路Texture输入,然后根据设定的渲染位置及大小, 在MainIndex的数据到来时按照index从低到高的顺序依次将输入Texture渲染到下一级的FBO上。 该类同时提供了scalingMode及mirror属性的设置。

3.3.3. 音频处理

AudioFilterMgt

音频滤镜的管理类,封装了对音频滤镜的动态替换操作。

AudioFilterBase

音频filter的基类,继承该类可以方便的自定义音频滤镜。

(KSY)AudioXXXFilter

SDK内部实现的各种音频Filter.

AudioMixer

混音处理类,可以支持最多8路音频的混合。

3.3.4. 预览

AudioPreview

音频预览的实现类,接收AudioBufFrame并将其播放出来。

ImgTexPreview

图像预览的实现类,接收ImgTexFrame并将其显示在设置的view上。SDK支持创建多个ImgTexPreview,可以据此实现多种美颜滤镜的同屏对比。

3.3.5. 编码

编码模块负责将原始的音视频数据进行压缩,以适合网络传输或本地存储。

Encoder

音视频编码器的基础类。

VideoBufEncoderBase

输入类型为ImgBufFrame的视频编码器基类。

AudioEncoderBase

输入类型为AudioBufFrame的音频编码器基类。

MediaCodecSurfaceEncoder

视频硬编的实现,根据机型本身的能力,实现了对264和265编码的支持。

MediaCodecAudioEncoder

音频硬编码的实现,支持AAC LC编码。

3.3.6. 封装和发布

这部分负责将编码后的音视频数据封装到一起,然后按照指定的协议、格式发送到网络或保存在本地。

AVAdapter

音视频交织及网络自适应模块。该类实现了推流过程中的网络统计,并可以根据实时网络状况反馈推荐的推流码率,可据此结合编码模块实现推流过程中的网络自适应。

Publisher

发送模块的基础实现类,可继承该类来实现自定义发送模块。

3.4. SDK各模块的连接方式

UnionStreamer 类将SDK中以及各个自定义模块串联起来,提供一套完整的推流功能,可以参见其源码及下面的框图来理解SDK中各个模块的连接方式。

Note
AudioPlayerCapture模块暂未实现,将在后续版本加入。
KSYStreamer组织结构图
Figure 1. UnionStreamer组织结构图(可以在新标签页中查看大图)