云端直播推流

功能简介: 用于多个主播实时连麦互动。技术实现上,我们会把房间里多个主播的音视频在服务器合成一路流后推流到CDN流媒体服务器,直播观众可以获取RTMP或HLS流观看直播。

互动直播架构图:


互动直播使用流程如下:

  1. 创建直播间并获得推流地址
  2. 开始互动直播
  3. 更新互动直播内容
  4. 获取互动直播状态
  5. 观众观看直播
  6. 停止互动直播
  7. 回放点播

1.创建直播间并获得推流地址

2.开始互动直播

互动直播时,可以根据业务需要,选择不同的直播布局。如下代码为创建左右布局的相关示例。

左右布局示例图:

左右布局示例图

  • 混图器参数配置
//配置混图器编码参数:尺寸为640*360,帧率为15,其他采用默认设置
MixerCfg mixerCfg = new MixerCfg();
mixerCfg.frameRate = 15;
mixerCfg.dstResolution = new Size(640, 360);
  • 混图器内容配置 - 左右布局
// 图像内容集合 - 创建左右布局的摄像头直播内容
ArrayList<MixerCotent> contents = new ArrayList<MixerCotent>();
//自己的摄像头(左边布局), 设置摄像头直播视频大小,由于左右布局, 宽度只有直播布局的一半
Rect leftRect = new Rect(0, 0, mixerCfg.dstResolution.width/2, mixerCfg.dstResolution.height);
MixerCotent leftVideoItem = MixerCotent.createVideoContent(myUserID, (short)-1, leftRect);
//添加到内容列表
contents.add(leftVideoItem);
//其他人的摄像头(右边布局)
Rect rightRect = new Rect(mixerCfg.dstResolution.width/2, 0, mixerCfg.dstResolution.width, mixerCfg.dstResolution.height);
MixerCotent rightVideoItem = MixerCotent.createVideoContent(otherUserID, (short)-1, rightRect);
//添加到内容列表
contents.add(rightVideoItem);
  • 混图器输出配置
//配置混图器输出
ArrayList<MixerOutPutCfg> cfgs = new ArrayList<MixerOutPutCfg>();
//添加推流配置:直播推流地址为rtmp://xxx
MixerOutPutCfg outputCfg = new MixerOutPutCfg();
//设置混图输出类型为直播
outputCfg.type = MIXER_OUTPUT_TYPE.MIXOT_LIVE; 
//推流地址
outputCfg.liveUrl = "rtmp://xxx";
cfgs.add(outputCfg);
  • 根据配置开启云端录制
HashMap<String, MixerCfg> mixerCfgs = new HashMap<String, MixerCfg>();
mixerCfgs.put("KEY_SVR_MIXERID", mixerCfg);

HashMap<String, ArrayList<MixerOutPutCfg>> mixerOutputCfgs = new HashMap<String, ArrayList<MixerOutPutCfg>>();
ArrayList<MixerOutPutCfg> outputCfgs = new ArrayList<MixerOutPutCfg>();
outputCfgs.add(outputCfg);
mixerOutputCfgs.put("KEY_SVR_MIXERID", outputCfgs);

HashMap<String, ArrayList<MixerCotent>> mixerContents = new HashMap<String, ArrayList<MixerCotent>>();
mixerContents.put("KEY_SVR_MIXERID", contents);

//开启互动直播
CRVIDEOSDK_ERR_DEF rst =  CloudroomVideoMeeting.getInstance().startSvrMixer(mixerCfgs, mixerContents, mixerOutputCfgs);
if(rst != CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_NOERR)
{
  //开启互动直播出错!
  ...
}
  • 回调通知:
//互动直播状态变化通知
void svrMixerStateChanged(String operatorID, MIXER_STATE state, CRVIDEOSDK_ERR_DEF err)
{
  ...
}

相关API请参考:

相关结构定义请参考:

3.更新互动直播内容

如下为创建画中画布局作为更新后的互动直播内容

画中画布局示例图:

左右布局示例图

  • 混图器内容配置 - 画中画布局
//更新为画中画模式
// 图像内容集合 - 创建画中画布局的摄像头直播内容, 
ArrayList<MixerCotent> contents = new ArrayList<MixerCotent>();

//自己的摄像头(充满布局)
Rect bigRect = new Rect(0, 0, mixerCfg.dstResolution.width, mixerCfg.dstResolution.height);
MixerCotent bigVideoItem = MixerCotent.createVideoContent(myUserID, (short)-1, bigRect);
// 添加到内容列表
contents.add(bigVideoItem);

//其他人的摄像头(部分布局)
Rect smallRect = new Rect(0, 0, mixerCfg.dstResolution.width/5, mixerCfg.dstResolution.height/5);
MixerCotent smallVideoItem = MixerCotent.createVideoContent(otherUserID, (short)-1, smallRect);
// 添加到内容列表
contents.add(smallVideoItem);
  • 更新混图器内容
HashMap<String, ArrayList<MixerCotent>> mixerContents = new HashMap<String, ArrayList<MixerCotent>>();
mixerContents.put("KEY_SVR_MIXERID", contents);

//更新直播内容
CloudroomVideoMeeting.getInstance().updateSvrMixerContent(mixerContents);

相关API请参考:

4. 获取互动直播状态


//获取互动直播状态
MIXER_STATE state = CloudroomVideoMeeting.getInstance().getSvrMixerState()

相关API请参考:

相关结构定义请参考:

5.观众观看直播

通过 播放器SDK观看直播.

6.停止互动直播

停止互动直播,也会触发事件svrMixerStateChanged

  • 接口调用:
CloudroomVideoMeeting.getInstance().stopSvrMixer();

相关API请参考:

7.回放点播

通过 云屋点播API回放点播。