# 本地录制

功能简介:
用户可以对通讯过程进行录制并保存到终端设备。

  • 录制画面可以根据业务场景自由拼接组合,包括本地摄像头、远端摄像头、本地屏幕、远端共享的屏幕、播放的视频文件、图片。支持同时启动多个录制。
  • 录制格式支持mp4、ts、flv、avi,如果选择了flv和ts两种格式,即使录制过程中程序崩溃了,崩溃之前的录像仍然可用。
  • 对于金融双录等安全性要求高的特定领域,我们支持对录制的文件进行加密,录制后直接把录像传到我们服务器,本地加密过的录像即使没有删除也只能通过SDK提供的播放器播放。

本地录制使用流程如下:

  1. 创建混图器
  2. 开启本地录制
  3. 录像文件事件处理
  4. 更新图像内容
  5. 结束

1.创建混图器

录制文件时,可以根据业务需要,选择不同的录制布局。如下有 左右布局画中画布局示例。

  • 接口调用:

var mixerID = "1";//混图器编号
var recordWidth = 640; //录制画布的宽高
var recordHeight = 360;

var SWidth = recordWidth; //图像占据宽高
var rate = 16/9; //假设图像比例为16:9
var SHeight = recordWidth/rate;

//配置混图器编码参数(此处:尺寸:360p, frameRate:8, 码率:350kbps,画质:28)
var mixerCfg = {"width":recordWidth,
                "height":recordHeight,
                "frameRate":8,
                "bitRate":350000,
                "defaultQP":28,
                "gop":120
                };

//配置混图器内容: 左右布局(示例图如下),左边为user1的1号摄像头, 右边为user2的1号摄像头
var mixerContent = [];
var leftCon = {}, rightCon = {};  //左右视频图像的内容配置
leftCon["type"] = 0; //0: 录制类型为视频
leftCon["left"] = 0 ;
leftCon["top"] = (recordHeight-sHeight/2)/2;   //视频图像垂直居中
leftCon["width"] = sWidth/2;
leftCon["height"] =  sHeight/2;
leftCon["param"] = {"camid":"user1.1"};
leftCon["keepAspectRatio"] = 1;
mixerContent.push(leftCon);

rightCon["type"] = 0; //0: 录制类型为视频
rightCon["left"] = sWidth/2;
rightCon["top"] = (recordHeight-sHeight/2)/2;   //视频图像垂直居中
rightCon["width"] = sWidth/2;
rightCon["height"] =  sHeight/2;
rightCon["param"] = {"camid":"user2.1"};
rightCon["keepAspectRatio"] = 1;
mixerContent.push(rightCon);
							               
//创建混图器
var errCode = CRVideo_CreateLocMixer(mixerID, mixerCfg, mixerContent);
if ( errCode != CRVideo_NOERR )
{
    //出错
    ...
}else
{
    //成功
}

(1)左右布局示例图:

左右布局示例图

相关API请参考:

相关结构定义请参考:

2.开启本地录制

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

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

//输出到d:/1.mp4文件;
var mixerOutput = [{"type":0,"filename":"D:/1.mp4"}];

//添加输出
var 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是输出信息对象,属性介绍如下: 
    
     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";
var recordWidth = 640; //录制画布的宽高
var recordHeight = 360;

var SWidth = recordWidth; //图像占据宽高
var rate = 16/9; //假设图像比例为16:9
var SHeight = recordWidth/rate;

//更新录制布局为:画中画

//混图器内容:画中画布局(示例图如下, 底层640*360, 上层160*90),底层为user1的1号摄像头, 上层为user2的1号摄像头
var mixerContent = [];
var leftCon = {}, rightCon = {};  //左右视频图像的内容配置
leftCon["type"] = 0; //0: 录制类型为视频
leftCon["left"] = 0 ;
leftCon["top"] = 0;   //视频图像垂直居中
leftCon["width"] = sWidth;
leftCon["height"] =  sHeight;
leftCon["param"] = {"camid":"user1.1"};
leftCon["keepAspectRatio"] = 1;
mixerContent.push(leftCon);

rightCon["type"] = 0; //0: 录制类型为视频
rightCon["left"] = sWidth - 160 - 5;  //上层图像距离最右边 5px
rightCon["top"] = sHeight - 90 -5;   //上层图像距离最下边 5px
rightCon["width"] = 160;
rightCon["height"] = 90;
rightCon["param"] = {"camid":"user2.1"};
rightCon["keepAspectRatio"] = 1;
mixerContent.push(rightCon);

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

(2)画中画布局示例图:

画中画布局示例图

相关API请参考:

5.结束

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

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

相关API请参考: