本地录制

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

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

本地录制使用流程如下:

  1. 创建混图器
  2. 添加输出到录像文件
  3. 录像文件回调处理
  4. 更新图像内容
  5. 结束录制文件
  6. 上传录制文件

1. 创建混图器

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

  • 设置混图器配置
    //混图器参数配置
    MixerCfg* mixerCfg = [[MixerCfg alloc]init];
    mixerCfg.fps = 15;
    mixerCfg.dstResolution = CGSizeMake(848,480);
  • 设置混图器内容
   // 图像内容集合 - 创建左右布局的摄像头录制内容,
    NSMutableArray<RecContentItem *> *contents = [NSMutableArray array];
    //获取左边(自己)用户id
    NSString *myUserID = [[CloudroomVideoMeeting shareInstance] getMyUserID];
    //获取c摄像头id
     short camID = [[CloudroomVideoMeeting shareInstance]  getDefaultVideo:myUserID];
    //自己的摄像头(左边布局), 设置摄像头录制视频大小,由于左右布局, 宽度只有录制布局的一半
    CGRect leftRect = CGRectMake(0, 0, mixerCfg.dstResolution.width/2, mixerCfg.dstResolution.height);
    // 添加到内容列表
    RecVideoContentItem *leftVideoItem = [[RecVideoContentItem alloc] initWithRect:leftRect userID:myUserID camID:camID];
    [contents addObject:leftVideoItem];
    
    //其他人的摄像头(右边布局)
    CGRect rightRect = CGRectMake(mixerCfg.dstResolution.width/2, 0, mixerCfg.dstResolution.width/2, mixerCfg.dstResolution.height);
    //此处otherUserID在进入用户进入会议时候可以保存,或者使用getAllMembers获取所有成员信息,找出对方id.
    NSString *otherUserID = @"";
    NSMutableArray <MemberInfo *> * allMemberInfo = [[CloudroomVideoMeeting shareInstance] getAllMembers];
    for (MemberInfo *memberInfo in allMemberInfo) {
        if(![memberInfo.userId isEqualToString:myUserID])
        {
            otherUserID = memberInfo.userId;
            break;
        }
    }
    short otherCamID = [[CloudroomVideoMeeting shareInstance]  getDefaultVideo:otherUserID];
    
    RecVideoContentItem* rightVideoItem = [[RecVideoContentItem alloc] initWithRect:rightRect userID:otherUserID camID:otherCamID];
    
    // 添加到内容列表
    [contents addObject:rightVideoItem];

	MixerContent *recContent = [[MixerContent alloc]init];
    recContent.contents = [contents copy];
  • 创建混图器
    CRVIDEOSDK_ERR_DEF rslt = [[CloudroomVideoMeeting shareInstance] createLocMixer:@"1" cfg:mixerCfg content:recContent];
    if(rslt == CRVIDEOSDK_NOERR)
    {
        //创建成功
    }

相关API请参考:

相关结构定义请参考:

2. 添加输出到录像文件


    NSMutableArray<OutputCfg*> *outputCfgs = [NSMutableArray array];
    OutputCfg* outputCfg = [[OutputCfg alloc]init];
    
    [outputCfg setFileName:[PathUtil searchPathInCacheDir:[NSString stringWithFormat:@"CloudroomVideoSDK/%d_iOS.mp4", self.meetInfo.ID]]];
    
    [outputCfgs addObject:outputCfg];
    
    self.currentRecordFileName = outputCfg.fileName;
    
    MixerOutput *mixerOutput = [[MixerOutput alloc]init];
    mixerOutput.outputs = outputCfgs;
    //mixerID是创建混图器设置的id
    rslt = [[CloudroomVideoMeeting shareInstance] addLocMixer:mixerID outputs:mixerOutput];
    
    if (rslt !== CRVIDEOSDK_NOERR) {
        //启动成功
    }

相关API请参考:

相关结构定义请参考:

3. 录像文件回调处理

在此可获得录像文件的时长、大小、录像文件异常等信息

-(void)locMixerOutputInfo:(NSString*)mixerID nameUrl:(NSString*)nameUrl outputInfo:(OutputInfo*)outputInfo
{
	if ( outputInfo.state==OUTPUT_ERR ){
        //录像文件出错,info.errCode中有错误原因
    }
}

相关API请参考:

4. 更新图像内容

如下创建画中画布局作为更新后的本地录制内容

  • 设置录制内容
// 图像内容集合 - 创建画中画布局的摄像头录制内容,
    NSMutableArray<RecContentItem *> *contents = [NSMutableArray array];
    //获取left(自己)用户id
    NSString *myUserID = [[CloudroomVideoMeeting shareInstance] getMyUserID];
    //获取c摄像头id
    short camID = [[CloudroomVideoMeeting shareInstance]  getDefaultVideo:myUserID];
    //自己的摄像头(充满布局)
   CGRect leftRect = CGRectMake(0, 0, mixerCfg.dstResolution.width, mixerCfg.dstResolution.height);
    // 添加到内容列表
    RecVideoContentItem *leftVideoItem = [[RecVideoContentItem alloc] initWithRect:leftRect userID:myUserID camID:camID];
    [contents addObject:leftVideoItem];
    
    //其他人的摄像头(右边布局)
    CGRect rightRect = CGRectMake(0, 0, mixerCfg.dstResolution.width/5, mixerCfg.dstResolution.height/5);
    //此处otherUserID在进入用户进入会议时候可以保存,或者使用getAllMembers获取所有成员信息,找出对方id.
    NSString *otherUserID = @"";
    NSMutableArray <MemberInfo *> * allMemberInfo = [[CloudroomVideoMeeting shareInstance] getAllMembers];
    for (MemberInfo *memberInfo in allMemberInfo) {
        if(![memberInfo.userId isEqualToString:myUserID])
        {
            otherUserID = memberInfo.userId;
            break;
        }
    }
    short otherCamID = [[CloudroomVideoMeeting shareInstance]  getDefaultVideo:otherUserID];
    
    RecVideoContentItem* rightVideoItem = [[RecVideoContentItem alloc] initWithRect:rightRect userID:otherUserID camID:otherCamID];
    
    // 添加到内容列表
    [contents addObject:rightVideoItem];
    MixerContent *recContent = [[MixerContent alloc]init];
    recContent.contents = [contents copy];
  • 更新混图器
// 更新图像内容
    CRVIDEOSDK_ERR_DEF rslt = [[CloudroomVideoMeeting shareInstance] updateLocMixerContent:@"1" content:contents];
    if (rslt == CRVIDEOSDK_NOERR) {
        //更新配置成功
    }

相关API请参考:

5. 结束录制文件


//消毁混图器, 输出自动结束
[[CloudroomVideoMeeting  shareInstance] destroyLocMixer:@"1"];

相关API请参考:

6. 上传录制文件

录制完毕后, 可将本地录制文件上传到云屋服务器。

 [CloudroomVideoMeeting shareInstance] uploadRecordFile:filePathName svrPathFileName:svrPath];

[[CloudroomVideoMeeting shareInstance] cancelUploadRecordFile:filePathName];

相关API请参考:

相关结构定义请参考: