通过阅读本文,您可以了解Android推流SDK的使用方法。

RTMP推流

  1. 创建AliLiveEngine。
    //创建RTMP相关配置对象
    AliLiveRTMPConfig rtmpConfig = new AliLiveRTMPConfig();
    //初始化码率配置
    rtmpConfig.videoInitBitrate = 1000;
    rtmpConfig.videoTargetBitrate = 1500;
    rtmpConfig.videoMinBitrate = 600;
    //创建直播推流配置
    AliLiveConfig mAliLiveConfig = new AliLiveConfig(rtmpConfig);
    //初始化分辨率、帧率、是否开启高清预览、暂停后默认显示图片
    mAliLiveConfig.videoFPS = 20;
    mAliLiveConfig.videoPushProfile = AliLiveConstants.AliLiveVideoPushProfile.AliLiveVideoProfile_540P;
    mAliLiveConfig.enableHighDefPreview = false;
    mAliLiveConfig.pauseImage = bitmap;
    mAliLiveConfig.accountId = "";
    AliLiveEngine mAliLiveEngine = AliLiveEngine.create(PushActivity.this, mAliLiveConfig);
  2. 开始预览。
    //创建预览显示窗口
    AliLiveRenderView mAliLiveRenderView = mAliLiveEngine.createRenderView(false);
    //添加预览显示窗口到布局中
    addSubView(mAliLiveRenderView);
    //设置预览显示模式
    mAliLiveEngine.setPreviewMode(AliLiveRenderModeAuto, AliLiveRenderMirrorModeOnlyFront);
    //开始预览
    mAliLiveEngine.startPreview(mAliLiveRenderView);
  3. 开始推流。
    mAliLiveEngine.startPush(mPushUrl);
  4. 停止拉流。
    //停止预览
    mAliLiveEngine.stopPreview();
    //停止推流
    mAliLiveEngine.stopPush();
    //销毁liveEngine
    mAliLiveEngine.destroy();
    mAliLiveEngine = null;

RTMP拉流

  1. 创建播放器。
    //创建播放器
    mAliPlayer = AliPlayerFactory.createAliPlayer(this.getApplicationContext());
    //设置自动播放
    mAliPlayer.setAutoPlay(true);
    //设置mMaxDelayTime,建议范围500~5000,值越小,直播时延越小,卡顿几率越大,根据需要自行决定
    PlayerConfig config = mAliPlayer.getConfig();
    config.mMaxDelayTime = 1000;
    mAliPlayer.setConfig(config);
  2. 添加显示的SurfaceView。
        mSurfaceView.getHolder().addCallback(this);
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            if (mAliPlayer!=null){
                mAliPlayer.setSurface(holder.getSurface());
            }
        }
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            if (mAliPlayer!=null){
                mAliPlayer.surfaceChanged();
            }
        }
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            if (mAliPlayer!=null){
                mAliPlayer.setSurface(null);
            }
        }
  3. 开始拉流。
    //给播放器设置拉流地址
    UrlSource source = new UrlSource();
    source.setUri(mPullUrl);
    mAliPlayer.setDataSource(source);
    //开始拉流
    mAliPlayer.prepare();
  4. 停止拉流。
    mAliPlayer.stop();
    mAliPlayer.setSurface(null);
    mAliPlayer.release();
    mAliPlayer = null;

连麦

主播端

  1. 主播进入房间,开始推RTC。
    //进入房间
    //由于是连麦房间,需要通知Appserver调用合流服务
    mSocketHandler.send(getSendMessage("JoinRoom",isAllowMicLink,0));
    //在进入房间成功的信令回调中,开始推RTC
    mAliLiveEngine.startPush(mRtcPushUrl);
    //推送RTC成功后,发送信令通知观众主播已开播
    mSocketHandler.send(getSendMessage("Publish", isAllowMicLink, 0));
  2. 主播收到辅播连麦信令,同意连麦。
    mSocketHandler.send(getSendMessage("ApproveMic",isAccept,userInfo.getUserId()));
  3. 主播收到辅播推流成功信令,开始订阅辅播RTC。
    mAliLiveEngine.subscribeStream(urlBean.getRtcPullUrl(),true);

    在订阅成功onSubscribeResult的回调里,把辅播画面渲染到View。

    //创建渲染画面
    AliLiveRenderView renderView = urlBean.getRenderView();
    //绑定渲染画面和拉流地址
    mAliLiveEngine.renderRemoteStreamWithView(renderView, s );
    //添加预览显示窗口到布局中
    addSubView(mAliLiveRenderView);
  4. 主播收到辅播下麦信令,取消订阅RTC。
    mAliLiveEngine.unSubscribeStream(remoteUserInfo.getRtcPullUrl());

辅播端

  1. 辅播进入房间,开始拉RTMP流。
    mSocketHandler.send(getSendMessage("JoinRoom"));
    // 初始化播放器,参考RTMP拉流步骤
    // .....
    // 开始拉流
    UrlSource source = new UrlSource();
    source.setUri("拉流地址");
    mAliPlayer.setDataSource(source);
    mAliPlayer.prepare();
  2. 辅播申请连麦。
    mSocketHandler.send(getSendMessage("ApplyMic"));
  3. 辅播收到主播同意连麦信令,开始连麦。
    mAliLiveEngine.startPush(url);

    推送RTC成功后,发送信令通知上麦成功,同时开始拉主播RTC和其他辅播RTC。

    //通知服务端开始推流
    mSocketHandler.send(getSendMessage("Publish"));
    //开始订阅主播流和其他连麦观众
    //......

    在主播拉RTC流成功后,停止播RTMP流。

    mAliPlayer.stop();
  4. 辅播下麦。
    //停止预览
    stopPreview();
    //停止推流
    stopPublish();
    //停止拉流
    stopPull();
    //开始播放RTMP的流
    startPlayRTMP();
    //发送下麦消息到服务端
    mSocketHandler.send(getSendMessage("UnPublish"));

主播PK

  1. 主播A发送请求至appserver,获取目前在线且符合要求的主播列表。
    mSocketHandler.send(getSendMessage(CMD_GET_ROOM_LIST));

    获取到主播列表后渲染到页面。

    mOnlineRoomView.setRoomList(onlineRoomList);
  2. 主播A在列表中找到一个主播B,请求PK。
    mSocketHandler.send(getSendMessage(CMD_APPLY_PK,room.getUserId(),room.getRoomId()));
  3. 主播B收到主播A的申请,并弹出提示。
    showApplyPkDialog(applyPkNoticeBean);
  4. 主播B同意了主播A的申请后,开始拉RTC流,并发送同意PK信令。
    //开始订阅主播A
    startPk(mLastApplyPkNotice.getFromRtcPullUrl());
    //开始发送同意PK信令
    mSocketHandler.send(getSendMessage(CMD_APPROVE_PK,true ,mLastApplyPkNotice.getFromUserId(),mLastApplyPkNotice.getFromRoomId() ));
  5. 主播A收到主播B的同意申请后,开始拉RTC流。
    //开始PK
    startPk(approvePkNoticeBean.getRtcPullUrl());
  6. onSubscribeResult回调中收到订阅成功的通知,调整预览和订阅画面的布局。
    showPkSurfaceView(true);
  7. 观众端播放的RTMP地址有变化,收到NotifyPublish信令后,重新构建播放器播放新地址。
    //判断是否和上次的主播拉流地址一致,不一致则重新拉流
    if (!mRoomInfo.getRtmpPullUrl().equals(noticePublish.getAnchorRtmpPullUrl())){
        mRoomInfo.setRtmpPullUrl(noticePublish.getAnchorRtmpPullUrl());
        startPlayRTMP();
    }
  8. 主播B停止PK,发送停止PK信令,停止拉RTC流,并恢复PK前画面。
    //发送停止PK信令
    mSocketHandler.send(getSendMessage(CMD_CANCEL_PK));
    //恢复PK之前的UI
    showPkSurfaceView(false);
  9. 观众端播放的RTMP地址有变化,收到NotifyPublish信令后,重新构建播放器播放新地址。
    //判断是否和上次的主播拉流地址一致,不一致则重新拉流
    if (!mRoomInfo.getRtmpPullUrl().equals(noticePublish.getAnchorRtmpPullUrl())){
        mRoomInfo.setRtmpPullUrl(noticePublish.getAnchorRtmpPullUrl());
        startPlayRTMP();
    }