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

主播发起连麦

更新时间:2017-09-06 11:46:48

  1. 主播向APP Server发出请求,希望与观众A、B连麦。

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

    1. final Call call = mInviteServiceBI.inviteCall(mUID,
    2. playerUIDs,
    3. InviteForm.TYPE_PIC_BY_PIC,
    4. FeedbackForm.INVITE_TYPE_ANCHOR, mRoomID,
    5. new ServiceBI.Callback()
  2. APP Server向观众A、B反馈主播的请求。

    (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、B向APP Server发送同意主播连麦请求的信号。

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

    1. mChatSession = new ChatSession(mSessionHandler);
    2. mChatSession.notifyReceivedInviting(msgDataInvite.getInviterUID(), mUID);
    3. //自动同意连麦
    4. try {
    5. Thread.sleep(2000);
    6. } catch (InterruptedException e) {
    7. e.printStackTrace();
    8. }
    9. asyncFeedbackInviting(msgDataInvite.getInviterUID());
  4. APP Server向观众A、B分配各自的推流地址,并发送主播流的播放地址。

    (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. 观众A、B开始连麦(即结束播放混流地址,开始推流、开始播放主播的播放地址)。

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

    1. public void startLaunchChat(String publisherUrl,
    2. SurfaceView previewSurface,
    3. String hostPlayUrl,
    4. Map<String, SurfaceView> urlSurfaceMap) {
    5. /**
    6. * 注意: 这里推流输出视频尺寸必须是360 * 640
    7. */
    8. //TODO:这里需要SDK支持
    9. if (!hasOnlineChats && !isChatting) {
    10. Log.d(TAG, "Call mChatParter.onlineChats() surface is valid ? " + previewSurface.getHolder().getSurface().isValid());
    11. mCallback.onEvent(IPlayerMgr.TYPE_PARTER_OPT_START, null);
    12. mChatParter.onlineChats(publisherUrl,
    13. 180,
    14. 320,
    15. previewSurface, mMediaParam, hostPlayUrl, urlSurfaceMap);
    16. hasOnlineChats = true;
    17. isChatting = true;
    18. } else if (isChatting) {
    19. addChats(urlSurfaceMap);
    20. }
    21. }
  6. APP Server收到AliLive给出的观众A、B推流成功的回调,将A、B的播放地址发送给主播和A、B、C。

    (APP Server端代码:service\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. }).catch((err) => {
    17. console.log(err);
    18. });
    19. }
  7. 主播开始与A、B进行连麦(即播放A、B的播放地址)。

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

    1. public void launchChats(Map<String, SurfaceView> urlSurfaceMap) {
    2. if ((mStatus & STATUS_CHATTING) == STATUS_MASK && mChattingUrls.size() == 0) {
    3. Log.d(TAG, "Call mChatHost.launchChats()");
    4. mChatHost.launchChats(urlSurfaceMap);
    5. mChattingUrls.addAll(urlSurfaceMap.keySet());
    6. mStatus |= STATUS_CHATTING;
    7. } else if (mChattingUrls.size() > 0) {
    8. Log.d(TAG, "Call mChatHost.addChats()");
    9. mChatHost.addChats(urlSurfaceMap);
    10. mChattingUrls.addAll(urlSurfaceMap.keySet());
    11. }
    12. }
  8. 副麦A增加与B的连麦(即播放B的播放地址)。

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

    1. public void addChats(Map<String, SurfaceView> urlSurfaceMap) {
    2. //TODO:需要SDK支持
    3. if (isChatting) {
    4. mCallback.onEvent(IPlayerMgr.TYPE_PARTER_OPT_START, null);
    5. mChatParter.addChats(urlSurfaceMap);
    6. }
    7. }
  9. 副麦B增加与A的连麦(即播放A的播放地址)。

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

    1. public void addChats(Map<String, SurfaceView> urlSurfaceMap) {
    2. //TODO:需要SDK支持
    3. if (isChatting) {
    4. mCallback.onEvent(IPlayerMgr.TYPE_PARTER_OPT_START, null);
    5. mChatParter.addChats(urlSurfaceMap);
    6. }
    7. }
  10. APP Server调用AliLive的混流接口,开始混流且A、B加入混流画面。至此,主播与A、B连麦成功。

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

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