# 本地/服务器音视频录制

# 本地录制

录制视频通话在本地生成视频文件。

# 开启本地录制

/**
 * @brief 开关会议录制(本地录制),内部根据状态决定是否开启
 *
 * @param enable 是否开启视频录制, true开始录制, false结束录制
 * @param recordLocalParams 录制参数
 * @see JCConferenceRecordLocalParams
 * @return 返回 true 表示正常执行调用流程,false 表示调用异常
 */
- (BOOL)enableLocalRecord:(BOOL)enable recordLocalParams:(JCConferenceRecordLocalParams*)recordLocalParams;

recordLocalParams的值有:

/**
 * @brief 录制帧率,默认18
 */
@property (nonatomic, assign) int frameRate;

/**
 * @brief 媒体录制视频合并模式,默认智能分屏模式,取值枚举如下:
 * JCConferenceVideoMergeModeMergeScreen(平铺屏幕共享和所有视频);
 * JCConferenceVideoMergeModeMergePlateForm(将屏幕共享和所有视频内容合并);
 * JCConferenceVideoMergeModeMergeSpeaker(将屏幕共享和焦点视频内容合并);
 * JCConferenceVideoMergeModeRealtimeVideo(只发送当前焦点视频);
 * JCConferenceVideoMergeModeMergeIntelligentLayout(智能分屏, 默认值);
 * JCConferenceVideoMergeModeScreenSharing(只发送屏幕共享);
 */
@property (nonatomic, assign) JCConferenceVideoMergeMode mergeMode;

/**
 * @brief  MergeMode为智能分屏模式下的布局样式(无屏幕共享),取值枚举如下:
 * JCConferenceIntelligentMergeModeFreeLayout(自由布局);
 * JCConferenceIntelligentMergeModeRectLayout(矩形布局);
 * JCConferenceIntelligentMergeModeBigSmallx2(大小屏放大2倍);
 * JCConferenceIntelligentMergeModeBigSmallx3(大小屏放大3倍);
 * JCConferenceIntelligentMergeModeBigSmallx4(大小屏放大4倍);
 * JCConferenceIntelligentMergeModeBigSmallx5(大小屏放大5倍);
 * JCConferenceIntelligentMergeModeBigSmallx6(大小屏放大6倍);
 * JCConferenceIntelligentMergeModeBigSmallx7(大小屏放大7倍);
 * JCConferenceIntelligentMergeModeBigSmallx8(大小屏放大8倍);
 * JCConferenceIntelligentMergeModeBigSmallx9(大小屏放大9倍);
 * JCConferenceIntelligentMergeModeBigSmallx10(大小屏放大10倍);
 * JCConferenceIntelligentMergeModeBigSmallTop(大小屏放大到顶部);
 * JCConferenceIntelligentMergeModeBigSmallBottom(大小屏放大到底部);
 * JCConferenceIntelligentMergeModeDivideLayout(绝对等分模式);
 * JCConferenceIntelligentMergeModeDivideLayoutNoangle(绝对等分模式不带图像角度);
 */
@property (nonatomic, assign) JCConferenceIntelligentMergeMode intelligentMergeMode;

/**
 * @brief MergeMode为智能分屏模式下的布局样式(有屏幕共享),取值枚举如下:
 * JCConferencelSrcMergeModeScreenShare(屏幕共享);
 * JCConferenceSrcMergeModePlateForm(将屏幕共享和所有视频内容合并, 所有视频不覆盖屏幕共享);
 * JCConferenceSrcMergeModePlateFormCover(将屏幕共享和所有视频内容合并, 所有视频覆盖在屏幕共享上);
 * JCConferenceSrcMergeModeSpeaker(将屏幕共享和焦点视频内容合并);
 * JCConferenceSrcMergeModeWithoutScreenShare(忽略屏幕共享);
 */
@property (nonatomic, assign) JCConferenceScsMergeMode scsMergeMode;

/**
 * @brief 视频的宽度,默认640
 */
@property (nonatomic, assign) int videoWidth;

/**
 * @brief 视频的高度,默认360
 */
@property (nonatomic, assign) int videoHeight;

/**
 * @brief 码率,默认0,自适应调节
 */
@property (nonatomic, assign) int iBitRate;

/**
 * @brief 保存的文件路径,必须包含文件名(xxx.mp4或者只录音的话xxx.aac)
 */
@property (nonatomic, copy, nonnull) NSString *filePath;

/**
 * @brief 是否录制视频,默认true
 */
@property (nonatomic) BOOL recVideo;

/**
 * @brief 是否录制音频,默认true
 */
@property (nonatomic) BOOL recAudio;

/**
 * @brief 录制是否包含自己,默认true
 */
@property (nonatomic) BOOL includeSelf;

示例代码:

if(conference.getConferenceInfo.getLocalRecordingState) {
  //开始录制
  JCConferenceRecordLocalParams *recordRecordLocalParams= [[JCConferenceRecordLocalParams alloc] init];
  [recordRecordLocalParams setFilePath:@"/juphoon/01.mp4"];
  ...
  [conference enableLocalRecord:true recordLocalParams:recordRecordLocalParams];
}  else {
  //关闭录制
}

# 关闭本地录制

/**
 * @brief 开关会议录制(本地录制),内部根据状态决定是否开启
 *
 * @param enable 是否开启视频录制, true开始录制, false结束录制
 * @param recordLocalParams 录制参数
 * @see JCConferenceRecordLocalParams
 * @return 返回 true 表示正常执行调用流程,false 表示调用异常
 */
- (BOOL)enableLocalRecord:(BOOL)enable recordLocalParams:(JCConferenceRecordLocalParams*)recordLocalParams;

示例代码:

if(conference.getConferenceInfo.getLocalRecordingState) {
  //开始录制
}  else {
  //关闭录制
  JCConferenceRecordLocalParams *recordRecordLocalParams= [[JCConferenceRecordLocalParams alloc] init];
  [conference enableLocalRecord:false recordLocalParams:recordRecordLocalParams];
}

# 服务器录制

# 录制准备

如果需要进行服务器音视频录制,需要在创建会议之前设置录制参数,然后在创建会议的时候传入录制参数。

示例代码:

// 设置录制参数
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
...其他参数...
[dic setObject:@YES forKey:JCConferenceConfigRemoteRecord]; YES需要服务器录制, 默认NO
[dic setObject:@YES forKey:JCConferenceConfigFixedResolution]; YES固定分辨率、码率, 默认NO
// 创建频道
[conference start:confNumber video:true config:dic];
// 或者首个成员加入频道不存在则创建
[dic setObject:@"1" forKey:JCConferenceConfigCreateAndJoin]; 创建设置 "1",不创建设置 "0",默认不创建
[conference join:confNumber video:true config:dic];

# 开始录制

根据目前的录制状态来判断是否可以开启音视频录制。

/**
 *  @brief 开关服务器视频录制
 *  @param enable 是否开启录制
 *  @param recordRemoteParams 录制参数
 *  @return 返回 true 表示正常执行调用流程,false 表示调用异常
 */
-(bool)enableRemoteRecord:(bool)enable recordRemoteParams:(JCConferenceRecordRemoteParams*)recordRemoteParams;

当会议中收到回调接口 onCommandReceivedResult (opens new window) 的回调并且 JCConferenceCommandInfo (opens new window) 参数的type属性值等于 JCConferenceCommandInfo.COMMANDINFO_DELIVERY_JOIN 后,表示录制就绪,即可开始录制。

JCConferenceRecordRemoteParams (opens new window) 有以下属性:

/**
 * @brief 录制是否包含视频,false的时候服务器为录音文件aac,默认为true
 */
@property (nonatomic) BOOL recordVideo;

/**
 * @brief媒体录制视频合并模式,取值枚举如下:
 * JCConferenceVideoMergeModeMergeScreen(平铺屏幕共享和所有视频);
 * JCConferenceVideoMergeModeMergePlateForm(将屏幕共享和所有视频内容合并);
 * JCConferenceVideoMergeModeMergeSpeaker将屏幕共享和焦点视频内容合并);
 * JCConferenceVideoMergeModeRealtimeVideo(只发送当前焦点视频);
 * JCConferenceVideoMergeModeMergeIntelligentLayout(智能分屏, 默认值);
 * JCConferenceVideoMergeModeScreenSharing(只发送屏幕共享);
 */
@property (nonatomic, assign) JCConferenceVideoMergeMode mergeMode;

/**
 * @brief 录制帧率,默认18
 */
@property (nonatomic, assign) int frameRate;

/**
 * @brief 视频的宽度,默认640
 */
@property (nonatomic, assign) int videoWidth;

/**
 * @brief 视频的高度,默认360
 */
@property (nonatomic, assign) int videoHeight;

/**
 * @brief 码率,默认0,自适应调节
 */
@property (nonatomic, assign) int iBitrate;

/**
 * @brief 其他参数, json格式
 */
@property (nonatomic, copy) NSString* extraInfo;

/**
 * @brief 水印串
 */
@property (nonatomic, strong) NSMutableDictionary* watermarkTextDic;

///以下存储参数
/**
 * @brief 存储环境 aws qiniu ftp等, 默认aws
 */
@property (nonatomic, copy) NSString* protocol;

/**
 * @brief 接入地址,ftp模式下例:ftp://127.0.0.1:21
 */
@property (nonatomic, copy) NSString* uploadEndpoint;

/**
 * @brief 存储环境相关key, ftp模式传ftp服务器登录名
 */
@property (nonatomic, copy) NSString* accessKey;

/**
 * @brief 存储环境相关key, ftp模式传ftp服务器登录密码
 */
@property (nonatomic, copy) NSString* secretKey;

/**
 * @brief 存储环境相关key
 */
@property (nonatomic, copy) NSString* bucketName;

/**
 * @brief 存储文件名, ftp模式下可以带路径如:juphoon/1.mp4
 */
@property (nonatomic, copy) NSString* fileName;

/**
 * @brief 分割文件大小
 */
@property (nonatomic, assign) int splitFileSize;

/**
 * @brief 对应portal上配置的录制样式的名字, 不传则用默认
 */
@property (nonatomic, copy) NSString* recLayoutType;

onCommandReceivedResult (opens new window) 回调接口:

/**
* @brief 收到会议属性变化或会议其他通知
*
* @param type 消息类型
*
*/
- (void)onCommandReceivedResult:(JCConferenceCommandInfo *)commandInfo;

示例代码:

JCConferenceRecordRemoteParams *recordRemoteParams = [[JCConferenceRecordRemoteParams alloc] init];
[recordRemoteParams setBucketName:@"lr23_00_record.00"];
NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
[dic setValue:@"6226090219298788 龚子清" forKey:@"name1"];
[dic setValue:@"601611 心悦人生综合保险产品计划" forKey:@"name2"];
[dic setValue:@"80231222 姓名" forKey:@"name3"];
[recordRemoteParams setWatermarkTextDic:dic];
[recordRemoteParams setFileName:@"202002042015_av.mp4"];

// 根据音视频录制状态判断是否开启音视频录制
if (conference.getConferenceInfo.remoteRecordState == JCConferenceRecordStateReady) {
    // 可以开启音视频录制
    [conference enableRemoteRecord:true recordB01Params:recordB01Params];
}

//录制开启后会收到onCommandReceivedResult回调
- (void)onCommandReceivedResult:(JCConferenceCommandInfo *)commandInfo {
    if(commandInfo.type == JCConferenceCommandInfoTypeDeliveryJoin){
        //执行开启录制成功后的操作
    }
}

# 结束录制

如果需要结束服务器音视频录制,调用接口 enableRemoteRecord (opens new window),并且设置参数 enable 设置为 false

/**
 *  @brief 开关服务器视频录制
 *  @param enable 是否开启屏幕录制
 *  @param recordRemoteParams 录制参数
 *  @return 返回 true 表示正常执行调用流程,false 表示调用异常
 */
-(bool)enableRemoteRecord:(bool)enable recordRemoteParams:(JCConferenceRecordRemoteParams*)recordRemoteParams;

当会议中收到回调接口 onCommandReceivedResult (opens new window) 的回调并且 JCConferenceCommandInfo (opens new window) 参数的type属性值等于 JCConferenceCommandInfo.COMMANDINFO_DELIVERY_JOIN 后,表示录制关闭。

示例代码:

// 根据音视频录制状态判断是否关闭音视频录制
if (conference.getConferenceInfo.remoteRecordState == JCConferenceRecordStateRunning) {
    // 可以关闭音视频录制
    [conference enableRemoteRecord:false recordB01Params:recordB01Params];
}

//录制关闭后会收到onCommandReceivedResult回调
- (void)onCommandReceivedResult:(JCConferenceCommandInfo *)commandInfo {
    if(commandInfo.type == JCConferenceCommandInfoTypeDeliveryJoin){
        //执行关闭录制后的操作
    }
}

# 获取录制状态

录制状态可通过 conference.getConferenceInfo().getRemoteRecordState 属性获得。

录制状态枚举:

/// 无法进行视频录制
JCConferenceRecordStateNone,
/// 可以开启视频录制
JCConferenceRecordStateReady,
/// 视频录制中
JCConferenceRecordStateRunning,

示例代码:

// 根据音视频录制状态判断是否开启音视频录制
if (conference.getConferenceInfo.remoteRecordState == JCConferenceRecordStateNone) {
    // 无法进行音视频录制
} else if (conference.getConferenceInfo.remoteRecordState == JCConferenceRecordStateReady) {
    // 可以开启音视频录制
    [conference enableRemoteRecord:true recordB01Params:recordB01Params];
} else if (conference.getConferenceInfo.remoteRecordState == JCConferenceRecordStateRunning) {
    // 音视频录制中,可以关闭音视频录制
    [conference enableRemoteRecord:false recordB01Params:recordB01Params];
}