本地直播推流

  1. 创建混图器
  2. 添加直播推流
  3. 直播推流回调处理
  4. 更新直播内容
  5. 结束

1.创建混图器

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

  • 设置混图器配置
//混图器参数配置
MixerCfg mixerCfg = new MixerCfg();
mixerCfg.frameRate = 15;
mixerCfg.dstResolution = new Size(864480);
  • 设置混图器内容
// 图像内容集合 - 创建左右布局的摄像头录制内容, 
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);
  • 创建混图器
// 创建混图器, 设置混图器编号为1
CRVIDEOSDK_ERR_DEF errCode = CloudroomVideoMeeting.getInstance().createLocMixer("1", mixerCfg, contents)if(errCode == CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_NOERR){
    //创建成功
}

相关API请参考:

相关结构定义请参考:

2.添加直播推流

//推流到A,B两个直播平台
ArrayList<MixerOutPutCfg> cfgs = new ArrayList<MixerOutPutCfg>();

// A直播平台
MixerOutPutCfg outputCfgA = new MixerOutPutCfg();
outputCfgA.type = MIXER_OUTPUT_TYPE.MIXOT_LIVE;
outputCfgA.liveUrl = "rtmp://A/xxx";
cfgs.add(outputCfgA);

// B直播平台
MixerOutPutCfg outputCfgB = new MixerOutPutCfg();
outputCfgB.type = MIXER_OUTPUT_TYPE.MIXOT_LIVE;
outputCfgB.liveUrl = "rtmp://B/xxx";
cfgs.add(outputCfgB);

//默认混图器编号为"1"
CRVIDEOSDK_ERR_DEF errCode = CloudroomVideoMeeting.getInstance().addLocMixerOutput("1", cfgs)if (errCode != CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_NOERR) {
    //设置成功
}

相关API请参考:

3.直播推流回调处理

void locMixerOutputInfo(String mixerID, String nameOrUrl, MixerOutputInfo info)
{
    if ( info.state==MIXER_OUTPUT_STATE.OUTPUT_ERR ){
            //直播文件出错,info.errCode中有错误原因
    }

相关API请参考:

4. 更新直播内容

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

  • 设置直播内容
// 图像内容集合 - 创建画中画布局的摄像头直播内容, 
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(leftVideoItem);

//其他人的摄像头(部分布局)
Rect smallRect = new Rect(0, 0, mixerCfg.dstResolution.width/5, mixerCfg.dstResolution.height/5)
MixerCotent rightVideoItem = MixerCotent.createVideoContent(otherUserID, (short)-1, smallRect);
// 添加到内容列表
contents.add(rightVideoItem);
  • 更新混图器
// 更新图像内容
CRVIDEOSDK_ERR_DEF errCode = CloudroomVideoMeeting.getInstance().updateLocMixerCotent("1", contents)if (errCode == CRVIDEOSDK_ERR_DEF.CRVIDEOSDK_NOERR) {
    //更新配置成功
}

相关API请参考:

5.结束

//混图器编号
String mixerID = "1";

//消毁混图器, 输出自动结束
CloudroomVideoMeeting.getInstance().destroyLocMixer(mixerID);

相关API请参考: