LFLiveKit的背景什么的就不一一介绍了,这里主要介绍它的功能实现的基础架构如下表:
| LFLiveKit |
LFLiveSession | 是整个sdk核心,提供对外部的主要接口。其主要功能有:管理推流开关,管理音视频录制及渲染,管理录制渲染后的音视频编吗,管理编吗后的数据上传,管理音视频的基础配置,回调推流状态和异常上报等。 |
LFLiveAudioConfiguration | 音频配置,配置相关音频信息(音频质量,码率,采样率,声道数) |
LFLiveVideoConfiguration | 视频配置,配置相关音频基本信息(视频质量,码率,帧数,分辨率)和应用配置如最大最小帧率等。 |
LFVideoCapture | 视频管理类,管理视频的输入和输出。同时处理业务需求如:美颜,亮度,水印等效果。用了一个第三方:GPUIImage处理渲染效果 |
LFAudioCapture | 音频管理,管理音频的输入开关。这一块儿没有多大的定制,应用的原生的API即可。 |
LFH264VideoEncoder,LFHardwareVideoEncoder | 视频编码类,分别对应8.0以前和8.0以后的两种设备的视频编码类。都遵守LFVideoEncoding协议,并设置LFStreamSocketDelegate协议给session管理 |
LFHardwareAudioEncoder | 音频编码类,遵守LFVideoEncoding协议,并设置LFStreamSocketDelegate协议给session管理 |
LFFrame | 数据信息的基类,作为上传到服务器数据的基本模型 |
LFVideoFrame | 视频信息,作为上传到服务器视频数据的模型 |
LFAudioFrame | 音频信息,作为上传到服务器音频数据的模型 |
LFLiveStreamInfo | 推流信息:推流地址(目前主要应用rtmp推流);流状态;音视频配置信息;异常信息 |
LFStreamRTMPSocket | 数据上传管理类:开关数据上传,回调连接状态和异常。遵循LFStreamSocket协议,并设置LFStreamSocketDelegate给session管理 |
LFLiveDebug | 调试信息:这个是开发时候的内部表示,主要用于记录调试作用。 |
LFStreamingBuffer | 本地采样:通过本地采样监控缓冲区,可实现相关切换帧率码率等策略 |
其主要功能流程如下:
LFLiveSession是整个sdk对外主要提供的接口,除了对外提供业务需求接口,而且管理了整个推流过程的不同功能的实现,并添加了一系列的回调接口。
LFLiveAudioConfiguration,LFLiveVideoConfiguration这两个配置信息作为一个参数,给各个类传值基本码率等基本信息。
LFVideoCapture,LFAudioCapture作为LFLiveSession的一个属性,可以管理视频类的输入的输入设备和输出设备,并且通过GPUIImage来进行一些图片的滤镜的操作,然后输出,通过代理方法回调给LFLiveSession。
LFH264VideoEncoder,LFHardwareVideoEncoder,LFHardwareAudioEncoder是管理音视频编吗的类。LFLiveSession接受到经过滤镜处理后的回调后,通过音视频编码类对buffer进行编码,并且在编码结束以后通过代理方法回调给LFLiveSession。
LFStreamRTMPSocket是数据上传管理类(目前只用rtmp上传),在LFLiveSession接收到编吗结束的回调后,就可以用LFStreamRTMPSocket进行数据上传。并提供网络状态回调和网络异常回调。
LFStreamingBuffer相对就比较灵活了,其功能呢主要是提供了一套根据本地缓冲区在规定时间内的量来回调缓冲区buffer是在增加还是在减少。如果需要在这方面进行一定的优化可以在回调中实现切换帧率等方法。在LFLiveKit里面是没有具体实现这种策略的后续处理方法,只是回调了增加还是减少的状态。
缺点:每一个buffer数据上传后,没有回调上传的结果。如果可以这样的话,可以根据上传的结果来判断推流端的具体网络状况。自身逻辑可以添加切换线路或者降低码率来实现直播质量的优化。