Skip to content
Franken Zeng edited this page Aug 10, 2017 · 19 revisions

金山云连麦接入指南

重要声明

从2017年6月起,金山云自研连麦不再开放给普通用户使用。请使用其他连麦方案。

给您造成的不便,深表歉意!


1.名词解释

  • 主播:正在直播的人。
  • 辅播:希望和主播连麦的观众。
  • 观众:观看直播的人。

2. 了解我们的特点

KSYRTCLive只提供底层连麦功能,开发者可以自由选择如何集成并使用。

选择我们的原因:

  • 主播和辅播之间声音图像均无延迟,采用最先进的RTP实时协议。
  • 全美颜,主播和辅播之间都是美颜过的,连麦无压力。
  • 多场景支持,主播和主播,主播和辅播,辅播和辅播,都是支持的。

不过要注意下面几个基本原则:

  • 需要连麦的双方都需要鉴权
  • 连麦的双方都有一个唯一id+公司名,鉴权时候需要用到,千万别重复了。
  • 连麦双方必须都注册上才能够连麦,推荐的方式是主播注册成功,辅播发起呼叫前注册。
  • 停止连麦后,还要反注册掉才行。
  • 本sdk依赖libksylive推流主版本,具体依赖哪个版本可以参看releasenote.
  • 当前支持一对一连麦,一对多连麦处于开发中。

3. 连麦场景

场景图

连麦A和B两者之间进行实时通信 实时通信延时时间在200ms之内,A和B之间直接推送和接受对方的音视频;A推送给B的视频数据和接受B的视频 数据均可以进行宽高比的缩小,从而减少带宽和发热量; 主播的上行带宽=(1+连麦人数)*码率; 主播的下行带宽=连麦人数*码率;

3.1主播和观众连麦模式

  • 主播注册上,开始直播。
  • 有观众需要连麦,发起请求,通过业务服务器发给主播。(业务逻辑,本sdk不提供)
  • 主播同意,通过业务服务器告诉观众。(业务逻辑,本sdk不提供)
  • 观众秒变辅播,主要这里需要关闭播放器,启动本sdk。(程序员搞不定这事?)
  • 辅播注册,辅播发起呼叫。(这时候主播发起也可以,需要再发IM通知)
  • 主播接听,开始连麦,其他观众也可能实时看到。
  • 其中一方挂断。
  • 任何一方不在连麦,反注册掉。

3.2 主播和主播连麦模式

  • 主播A注册上,开始直播。
  • 主播B需要连麦,发起请求,通过业务服务器发给主播。(业务逻辑,本sdk不提供)
  • 主播A同意,通过业务服务器告诉主播B。(业务逻辑,本sdk不提供)
  • 主播B秒变辅播,开始注册,辅播发起呼叫。(这时候主播A发起也可以,需要再发IM通知)
  • 主播接听,开始连麦,其他观众也可能实时看到。
  • 其中一方挂断。
  • 任何一方不在连麦,反注册掉。

4 集成代码解析(连麦)(点了star的可以看)

这里只介绍连麦,推流相关,请移步KSYStreamer
使用流程图

1 快速集成

vRTC1.5.1版本以后,提供连麦单独的jar和so,并且通过jcenter方式来集成推流库,具体如下:

1.1 集成连麦库:

工程目录中libs下面的文件copy到目标工程中,文件介绍:

  • libs/[armeabi-v7a|arm64-v8a|x86]:libksyrtc.so 各平台的连麦so库
  • libs/libksyrtc.jar: 连麦SDK jar包
  • libs/libjingle_peerconnection_java.jar: 连麦SDK依赖 jar包

1.2 集成推流库:

需要在build.gradel中添加jcenter依赖,并dependencies版本:

//添加jcener依赖
allprojects {
    repositories {
        jcenter()
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile fileTree(dir: 'libs/armeabi-v7a', include: '*/so')
    compile 'com.android.support:appcompat-v7:24.2.1'
    //添加依赖libksylive.jar,2.2.1 是依赖的Android融合库的版本信息
    compile 'com.ksyun.media:libksylive-java:2.2.1'   
    //添加依赖libksylive.so
    compile 'com.ksyun.media:libksylive-arm64:2.2.1'   
    compile 'com.ksyun.media:libksylive-armv7a:2.2.1'
    compile 'com.ksyun.media:libksylive-x86:2.2.1'
}

2 参数配置

2.1配置鉴权参数

具体参见[鉴权逻辑](https://github.com/ksvc/KSYRTCLive_Android/wiki/auth)

2.2配置其它参数

参考Demo中doRegister函数

//must set before register
//设置小窗口的大小、位置、显示模式
mStreamer.setRTCSubScreenRect(0.65f, 0.f, 0.35f, 0.3f, RTCConstants.SCALING_MODE_CENTER_CROP);
//设置AuthURI、AuthString、UID
mStreamer.getRtcClient().setRTCAuthInfo(RTC_AUTH_URI, authString,mRTCLocalURIEditText.getText().toString());
//设置UniqueName
mStreamer.getRtcClient().setRTCUniqueName(RTC_UINIQUE_NAME);
//has default value
//设置对端连麦视频是主屏还是camera是主屏
mStreamer.setRTCMainScreen(RTCConstants.RTC_MAIN_SCREEN_CAMERA);
设置分辨率对比预览分比率的缩放比例
mStreamer.getRtcClient().setRTCResolutionScale(0.5f); 
//设置连麦fps  
mStreamer.getRtcClient().setRTCFps(Integer.parseInt(mRTCFpsEditText.getText().toString()));
//设置连麦视频码率
mStreamer.getRtcClient().setRTCVideoBitrate(256 * 1024);

vRTC1.5.0版本不支持通过KSYStreamerConfig设置

3 连麦

3.1通过回调函数监控状态

//错误监控
mStreamer.getRtcClient().setRTCErrorListener(mRTCErrorListener);
//event监控 
mStreamer.getRtcClient().setRTCEventListener(mRTCEventListener);

3.2 注册连麦

注册前需要配置参数,参考2

mStreamer.registerRTC();

3.3 发起呼叫(主播侧)

NOTE:远端id的获取,需要客户自己保证,SDK不获取。

mStreamer.startCall(remoteID);

3.4 应答呼叫(辅播侧)

3.4.1 呼叫到达:RTCClient.RTC_EVENT_CALL_COMMING

    private RTCClient.RTCEventChangedListener mRTCEventListener = new RTCClient.RTCEventChangedListener() {
        @Override
        public void onEventChanged(int event, Object arg1) {
            switch (event) {
                case RTCClient.RTC_EVENT_REGISTED:
                    doRegisteredSuccess();
                    break;
                case RTCClient.RTC_EVENT_STARTED:
                    doStartCallSuccess();
                    break;
                case RTCClient.RTC_EVENT_CALL_COMMING:
                    doReceiveRemoteCall(String.valueOf(arg1));
                    break;
                case RTCClient.RTC_EVENT_STOPPED:
                    Log.d(TAG, "stop result:" + arg1);
                    doStopCallResult();
                    break;
                case RTCClient.RTC_EVENT_UNREGISTED:
                    Log.d(TAG, "unregister result:" + arg1);
                    doUnRegisteredResult();
                    break;
                default:
                    break;
            }

        }
    };

3.4.2:处理呼叫

接受呼叫

mStreamer.answerCall();

拒绝呼叫

mStreamer.rejectCall();

3.5:连麦建立

3.5.1:连麦建立成功,`RTCClient.RTCEventChangedListener的RTCClient.RTC_EVENT_STARTED

    private RTCClient.RTCEventChangedListener mRTCEventListener = new RTCClient.RTCEventChangedListener() {
        @Override
        public void onEventChanged(int event, Object arg1) {
            switch (event) {
                case RTCClient.RTC_EVENT_REGISTED:
                    doRegisteredSuccess();
                    break;
                case RTCClient.RTC_EVENT_STARTED:
                    doStartCallSuccess();
                    break;
                case RTCClient.RTC_EVENT_CALL_COMMING:
                    doReceiveRemoteCall(String.valueOf(arg1));
                    break;
                case RTCClient.RTC_EVENT_STOPPED:
                    Log.d(TAG, "stop result:" + arg1);
                    doStopCallResult();
                    break;
                case RTCClient.RTC_EVENT_UNREGISTED:
                    Log.d(TAG, "unregister result:" + arg1);
                    doUnRegisteredResult();
                    break;
                default:
                    break;
            }

        }
    };

4:连麦断开

4.1:断开连麦

mStreamer.stopCall();

4.2:连接断开回调

  • 收到回调RTCClient.RTCEventChangedListener的RTCClient.RTC_EVENT_STOPPED

4.3:连接异常断开回调

  • 收到回调RTCClient.RTC_ERROR_SERVER_ERROR或者RTCClient.RTC_ERROR_CONNECT_FAIL

4.4:反注册

4.4.1:发起

mStreamer.unregisterRTC();

4.4.2:反注册回调

  • RTCClient.RTCEventChangedListener的RTCClient.RTC_EVENT_UNREGISTED