全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
视频直播

观众加入连麦

更新时间:2017-09-04 19:08:29

  1. 观众C向APP Server发出申请,要求加入连麦。

    (客户端代码:LifecycledPlayerMgr.java文件中)

    1. mInviteCall = mInviteServiceBI.inviteCall(mUID, inviteeUIDs,
    2. InviteForm.TYPE_PIC_BY_PIC, FeedbackForm.INVITE_TYPE_WATCHER, mLiveRoomID, new ServiceBI.Callback()
  2. APP Server向主播和副麦A转发观众C的申请。

    (APP Server端代码:controller\videocallctrl.js文件中)

    1. inviteeUids.forEach((uid) => {
    2. if (uid) {
    3. let msg = util.createMqttMsg({
    4. inviterUid: inviterUid,
    5. inviterName: inviterInfo.name,
    6. inviterType: inviterType
    7. }, 1);
    8. mns.publish(liveRoomId, msg, 4, util.getUserTopicTag(liveRoomId, uid));
    9. }
    10. });
  3. 主播和副麦A向APP Server发送同意连麦的信号。

    (客户端代码:LifecycledPlayerMgr.java文件中)

    1. ChatSession chatSession = new ChatSession(mSessionHandler);
    2. chatSession.notifyReceivedInviting(mUID, msgDataInvite.getInviterUID());
    3. mChatSessionMap.put(msgDataInvite.getInviterUID(), chatSession);
  4. APP Server向观众C分配推流地址,并发送主播和副麦A的播放地址。

    (APP Server端代码:controller\videocallCtrl.js文件中)

    1. videoCall.store(mainRoomId, uid + "|" + roomId);
    2. videoCall.setMainBy(roomId, mainRoomId);
    3. response.success(res, {
    4. mainPlayUrl: address.getShortRtmpPlayUrl(mainRoomId),//主播播放地址
    5. playUrls: otherPlayUrls, //已经推流观众播放地址
    6. rtmpUrl: address.getRtmpUrl(roomId) //被同意连麦观众的推流地址
    7. });
  5. 观众C开始连麦(即结束播放混流地址,开始推流、开始播放主播和副麦A的播放地址)。

    (客户端代码:PlayerSDKHelper.java文件中,调用SDK接口onlineChats)

    1. public void startLaunchChat(String publisherUrl,
    2. SurfaceView previewSurface,
    3. String hostPlayUrl,
    4. Map<String, SurfaceView> urlSurfaceMap) {
    5. if (!hasOnlineChats && !isChatting) {
    6. Log.d(TAG, "Call mChatParter.onlineChats() surface is valid ? " + previewSurface.getHolder().getSurface().isValid());
    7. mCallback.onEvent(IPlayerMgr.TYPE_PARTER_OPT_START, null);
    8. mChatParter.onlineChats(publisherUrl,
    9. 180,
    10. 320,
    11. previewSurface, mMediaParam, hostPlayUrl, urlSurfaceMap);
    12. hasOnlineChats = true;
    13. isChatting = true;
    14. } else if (isChatting) {
    15. addChats(urlSurfaceMap);
    16. }
    17. }
  6. APP Server收到AliLive给出的观众C推流成功的回调,将C的播放地址发送给主播和A、B、C。

    (APP Server端代码:controller\alinotify.js文件中)

    1. static publish(liveInfo) {
    2. let roomId = liveInfo.roomId;
    3. delayQueue.deQueue(roomId);
    4. let msg = util.createMqttMsg({
    5. uid: liveInfo.uid,
    6. roomId: roomId,
    7. name: liveInfo.name,
    8. playUrl: address.getShortRtmpPlayUrl(roomId)
    9. }, 9);
    10. co(function*() {
    11. //设置推流状态
    12. live.setStatus(roomId, 1);
    13. let mainRoomId = yield videoCall.getMainBy(roomId);
    14. //发送推流通知
    15. mns.publish(mainRoomId ? mainRoomId : roomId, msg, 5);
    16. if (mainRoomId) {
    17. //如果是连麦观众加入混流
    18. yield videoCall.addToMix(mainRoomId, roomId, liveInfo.uid, liveInfo.name);
    19. }
    20. }).catch((err) => {
    21. console.log(err);
    22. });
    23. }
  7. 主播增加与C的连麦(即播放C的播放地址)。

    (客户端代码:PublisherSDKHelper.java文件中,调用SDK接口addChats)

    1. mChatHost.addChats(urlSurfaceMap);
    2. mChattingUrls.addAll(urlSurfaceMap.keySet());
  8. 副麦A增加与C的连麦(即播放C的播放地址)。

    (客户端代码:PlayerSDKHelper.java文件中,调用SDK接口addChats)

    1. public void addChats(Map<String, SurfaceView> urlSurfaceMap) {
    2. //TODO:需要SDK支持
    3. if (isChatting) {
    4. Log.d(TAG, "Call mChatParter.addChats()");
    5. mCallback.onEvent(IPlayerMgr.TYPE_PARTER_OPT_START, null);
    6. mChatParter.addChats(urlSurfaceMap);
    7. }
    8. }
  9. APP Server调用AliLive的混流接口,C加入混流画面。至此,观众C加入连麦成功。

    (APP Server端代码:controller\videocallCtrl.js文件中,调用OpenAPI接口AddMultipleStreamMixService)

    1. if (mainRoomId) {
    2. yield videoCall.addToMix(mainRoomId, roomId, liveInfo.uid, liveInfo.name);
    3. }
本文导读目录