# 本地直播推流

  1. 创建混图器
  2. 开启直播推流
  3. 直播推流事件处理
  4. 更新图像内容
  5. 结束

1.创建混图器

  • 接口调用:
//混图器编号

var mixerID = "1";

//混图器规格配置, 尺寸:360p, frameRate:8, 码率:350kbps,画质:28
var mixerCfg = {"width":640,
                "height":360,
                "frameRate":8,
                "bitRate":350000,
                "defaultQP":28,
                "gop":120
                };

//混图器内容: 左右布局,左边为user1的1号摄像头, 右边为user2的1号摄像头
var mixerContent = [{"type":0,
                    "keepAspectRatio":1,
                    "left":5,
                    "top":10,
                    "width":633,
                    "height":356,
                    "param":{"camid":"user1.1"}
                    },
                    {"type":0,
                    "keepAspectRatio":1,
                    "left":642,
                    "top":10,
                    "width":633,
                    "height":356,
                    "param":{"camid":"user2.1"}
                    }];

//创建混图器
CRVideo_ERR_DEF errCode = CRVideo_CreateLocMixer(mixerID, mixerCfg, mixerContent);
if ( errCode!=CRVideo_NOERR )
{
    //出错
    ...
}
else
{
    //成功
}

左右布局示例图:

左右布局示例图

相关API请参考:

相关结构定义请参考:

2.开启直播推流

添加混图器输出后,会触发CRVideo_LocMixerOutputInfo通知.如果输出异常,将自动停止推流。

  • 接口调用:
//混图器编号
var mixerID = "1";

//推流到A,B两个直播平台
var mixerOutput = [{"type":1,"liveUrl":"rtmp://A/xxx"},
                    {"type":1,"liveUrl":"rtmp://B/xxx"}];

//添加直播推流
CRVideo_ERR_DEF errCode = CRVideo_AddLocMixerOutput(mixerID, mixerOutput);
if ( errCode!=CRVideo_NOERR )
{
    //出错
    ...
}
else
{
    //成功
}

相关API请参考:

相关结构定义请参考:

3.直播推流事件处理

录制过程中都会触发此事件。在此可以实时获得录像文件当前的时长、大小,以及录像文件异常等信息。

  • 回调通知:
//录制文件、直播信息通知 
CRVideo_LocMixerOutputInfo.callback = function(mixerID,nameOrUrl,outputInfo) {
    if(outputInfo.state == CRVideo_OUTPUT_STATE.OUTPUT_ERR ) 
    {
        //推流出错,outputInfo.errCode中有错误原因
    }
    else
    {
        //可以得到推流时长、大小
    }
}
/* 输出对象状态,属性介绍如下: 
    
     outputInfo.state   - 状态,请见后面描述 CRVideo_OUTPUT_STATE;
     outputInfo.duration  - 录录像文件时长,单位:毫秒。
	 outputInfo.fileSize    - 录像文件大小
	 outputInfo.errCode   - 错误码

//其中 state 取值如下:
     CRVideo_OUTPUT_STATE =
	{
		//输出对象已创建
		OUTPUT_CREATED:0,
		//输出目标信息更新; 可以从结构中取得:duration, fileSize参数;
		OUTPUT_WRITING:1,
		//输出对象已关闭; 可以从结构中取得:duration, fileSize参数;
		OUTPUT_CLOSED:2,
		//输出对象异常;可以从结构中取得:err参数;
		OUTPUT_ERR:3
	}
*/

相关API请参考:

相关结构定义请参考:

4.更新图像内容

  • 接口调用:
//混图器编号
var mixerID = "1";

//混图器内容: 左右布局,左边为user1的1号摄像头, 右边为user1的2号摄像头
var mixerContent = [{"type":0,
                    "keepAspectRatio":1,
                    "left":5,
                    "top":10,
                    "width":633,
                    "height":356,
                    "param":{"camid":"user1.1"}
                    },
                    {"type":0,
                    "keepAspectRatio":1,
                    "left":642,
                    "top":10,
                    "width":633,
                    "height":356,
                    "param":{"camid":"user1.2"}
                    }];

//更新混图器内容
CRVideo_ERR_DEF errCode = CRVideo_UpdateLocMixerContent(mixerID,mixerContent);
if ( errCode!=CRVideo_NOERR )
{
    //出错
    ...
}
else
{
    //成功
}

上述混图器内容左右布局,详见左右布局

5.结束

  • 接口调用:
//混图器编号
var mixerID = "1";

//消毁混图器, 各输出自动结束
CRVideo_DestroyLocMixer(mixerID);

相关API请参考: