本地直播推流
1.创建混图器
直播时,可以根据业务需要,选择不同的录制布局。如下代码为创建左右布局的相关示例。
- 设置混图器配置
//混图器参数配置
MixerCfg mixerCfg = new MixerCfg();
mixerCfg.frameRate = 15;
mixerCfg.dstResolution = new Size(864, 480);
- 设置混图器内容
// 图像内容集合 - 创建左右布局的摄像头录制内容,
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请参考: