最近公司项目中有直播模块,模块已经基本完成故将这段时间的收获总结一下,和大家分享,互相进步....
首先我集成的是金山云的直播SDK,网址如下 https://github.com/ksvc/KSYLive_Android 这个是金山云目前为止最新的SDK 他包括了推流端和播放端两部分,即一个SDK全搞定,不需要再去单独集成。 效果图如下:
其实一开始我是把他放在libs文件夹下的后来不知道为什么一直提示错误,所以就把它放在了jniLibs里面了。不过jar文件还是得放到libs里面的。
在ksyun.media目录下有两个文件夹 分别是player和streamer 这两个就是对应的拉流和推留的工具啦。
然后进入代码的书写:
主播端的推流配置需要专门放在一个类中去写,我这里全都写在了一个PushExtend的类中,具体代码如下:
public class PushExtend { public static KMCAgoraStreamer mStreamer; public static void initPush(KMCAgoraStreamer vmStreamer, String url) { isStop = false; mStreamer = vmStreamer; mStreamer.setUrl(url); // mStreamer.setUrl("rtmp://test.uplive.ksyun.com/live/{streamName}"); // 设置预览分辨率, 当一边为0时,SDK会根据另一边及实际预览View的尺寸进行计算 mStreamer.setPreviewResolution(480, 0); // 设置推流分辨率,可以不同于预览分辨率 mStreamer.setTargetResolution(480, 0); // 设置预览帧率 mStreamer.setPreviewFps(15); // 设置推流帧率,当预览帧率大于推流帧率时,编码模块会自动丢帧以适应设定的推流帧率 mStreamer.setTargetFps(15); // 设置视频码率,分别为初始平均码率、最高平均码率、最低平均码率,单位为kbps,另有setVideoBitrate接口,单位为bps mStreamer.setVideoKBitrate(600, 800, 400); // 设置音频采样率 mStreamer.setAudioSampleRate(44100); // 设置音频码率,单位为kbps,另有setAudioBitrate接口,单位为bps mStreamer.setAudioKBitrate(48); /** * 设置编码模式(软编、硬编): * StreamerConstants.ENCODE_METHOD_SOFTWARE * StreamerConstants.ENCODE_METHOD_HARDWARE */ mStreamer.setEncodeMethod(StreamerConstants.ENCODE_METHOD_SOFTWARE); // 设置屏幕的旋转角度,支持 0, logo_nine, 180, 270 mStreamer.setRotateDegrees(0); // 开启推流统计功能 mStreamer.setEnableStreamStatModule(true); } static void Eresume() { // 一般可以在onResume中开启摄像头预览 mStreamer.startCameraPreview(); // 调用KSYStreamer的onResume接口 mStreamer.onResume(); // 如果正在推流,切回音视频模式 if (mStreamer.isRecording()) { mStreamer.setAudioOnly(false); } } static void Epause() { if (!isStop) { mStreamer.onPause(); // 一般在这里停止摄像头采集 mStreamer.stopCameraPreview(); // 如果正在推流,切换至音频推流模式 if (mStreamer.isRecording()) { mStreamer.setAudioOnly(true); } } } public static void Edestroy() { if (!isStop) { // 清理相关资源 mStreamer.release(); PushExtend.isStop = true; } } public static void EStar() { mStreamer.startStream(); } public static void EswitchCamera() { // 切换前后摄像头 mStreamer.switchCamera(); } //是否关闭了推流了 static Boolean isStop = false; }
主要需要配置如下的几个配置:设置推流的地址,设置推流的分辨率(我们选得是480),设置帧率(即每秒展示的图片的数量)我们选中的是15,设置码率,我们默认的是设置平均码率是600 最低码率是400 最高码率是800,设置音频采样率是44100 设置音频的码率是48 Android默认采用的是软编码,设置旋转角度为0,同时要开启推流统计功能。
整个直播的主要流程为:直播鉴权--开启推流(开启推留的同时需要同时开启直播的心跳请求,心跳的作用就是客户端需要每隔一定的时间向服务器发送socket包,服务器会根据发送的请求包来判断当前的直播是否存在,如果心跳停止则视为当前的直播已经异常退出,此时服务器就会将该直播数据杀死 防止产生脏数据 客户端出现闪退的情况 同时心跳包里也会把当前的直播数据传递给服务器 包括当前直播的点赞数量 观看的人数与 以及收到的礼物的数量 是否)--在推流成功的回调中去开启环信加入聊天室的方法--在环信加入聊天室成功的会调用服务器接口获取当前直播间的一些数据(包括:主播的头像、id、昵称以及服务器保存的该主播的关注、点赞和礼物总数 以及当前的连麦状态和与当前主播连麦人的id,便于粉丝段跳转到连麦主播的直播间)