-
Notifications
You must be signed in to change notification settings - Fork 8
Home
Franken Zeng edited this page Aug 10, 2017
·
19 revisions
从2017年6月起,金山云自研连麦不再开放给普通用户使用。请使用其他连麦方案。
给您造成的不便,深表歉意!
- 主播:正在直播的人。
- 辅播:希望和主播连麦的观众。
- 观众:观看直播的人。
KSYRTCLive只提供底层连麦功能,开发者可以自由选择如何集成并使用。
选择我们的原因:
- 主播和辅播之间声音图像均无延迟,采用最先进的RTP实时协议。
- 全美颜,主播和辅播之间都是美颜过的,连麦无压力。
- 多场景支持,主播和主播,主播和辅播,辅播和辅播,都是支持的。
不过要注意下面几个基本原则:
- 需要连麦的双方都需要鉴权。
- 连麦的双方都有一个唯一id+公司名,鉴权时候需要用到,千万别重复了。
- 连麦双方必须都注册上才能够连麦,推荐的方式是主播注册成功,辅播发起呼叫前注册。
- 停止连麦后,还要反注册掉才行。
- 本sdk依赖libksylive推流主版本,具体依赖哪个版本可以参看releasenote.
- 当前支持一对一连麦,一对多连麦处于开发中。
连麦A和B两者之间进行实时通信 实时通信延时时间在200ms之内,A和B之间直接推送和接受对方的音视频;A推送给B的视频数据和接受B的视频 数据均可以进行宽高比的缩小,从而减少带宽和发热量; 主播的上行带宽=(1+连麦人数)*码率; 主播的下行带宽=连麦人数*码率;
- 主播注册上,开始直播。
- 有观众需要连麦,发起请求,通过业务服务器发给主播。(业务逻辑,本sdk不提供)
- 主播同意,通过业务服务器告诉观众。(业务逻辑,本sdk不提供)
- 观众秒变辅播,主要这里需要关闭播放器,启动本sdk。(程序员搞不定这事?)
- 辅播注册,辅播发起呼叫。(这时候主播发起也可以,需要再发IM通知)
- 主播接听,开始连麦,其他观众也可能实时看到。
- 其中一方挂断。
- 任何一方不在连麦,反注册掉。
- 主播A注册上,开始直播。
- 主播B需要连麦,发起请求,通过业务服务器发给主播。(业务逻辑,本sdk不提供)
- 主播A同意,通过业务服务器告诉主播B。(业务逻辑,本sdk不提供)
- 主播B秒变辅播,开始注册,辅播发起呼叫。(这时候主播A发起也可以,需要再发IM通知)
- 主播接听,开始连麦,其他观众也可能实时看到。
- 其中一方挂断。
- 任何一方不在连麦,反注册掉。
这里只介绍连麦,推流相关,请移步KSYStreamer
vRTC1.5.1版本以后,提供连麦单独的jar和so,并且通过jcenter方式来集成推流库,具体如下:
工程目录中libs下面的文件copy到目标工程中,文件介绍:
- libs/[armeabi-v7a|arm64-v8a|x86]:libksyrtc.so 各平台的连麦so库
- libs/libksyrtc.jar: 连麦SDK jar包
- libs/libjingle_peerconnection_java.jar: 连麦SDK依赖 jar包
需要在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'
}
具体参见[鉴权逻辑](https://github.com/ksvc/KSYRTCLive_Android/wiki/auth)
参考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设置
//错误监控
mStreamer.getRtcClient().setRTCErrorListener(mRTCErrorListener);
//event监控
mStreamer.getRtcClient().setRTCEventListener(mRTCEventListener);
注册前需要配置参数,参考2
mStreamer.registerRTC();
NOTE:远端id的获取,需要客户自己保证,SDK不获取。
mStreamer.startCall(remoteID);
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;
}
}
};
接受呼叫
mStreamer.answerCall();
拒绝呼叫
mStreamer.rejectCall();
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;
}
}
};
mStreamer.stopCall();
- 收到回调RTCClient.RTCEventChangedListener的RTCClient.RTC_EVENT_STOPPED
- 收到回调RTCClient.RTC_ERROR_SERVER_ERROR或者RTCClient.RTC_ERROR_CONNECT_FAIL
mStreamer.unregisterRTC();
- RTCClient.RTCEventChangedListener的RTCClient.RTC_EVENT_UNREGISTED