录制

本章节着重介绍实时音视频有关录制的内容。网易云实时音视频提供服务端录制客户端录制两种录制方式。

服务端录制需要您联系我们的商务经理,开通此功能,并且需要在管理中心中成功配置消息抄送服务,假设A和B进行点对点实时音视频通话,服务端录制下来的文件包括:A的音视频文件(.mp4)**B的音视频文件(.mp4)。如果是纯音频通话,则没有相应的音视频文件,如果您开通了服务端混合录制,则还会生成一个A和B的混合音视频文件(.mp4)。假设A、B、C进行多人实时音视频通话,进入房间时,设置了服务器录制音频开关、录制视频开关、单人文件录制开关、服务端录制下来的文件包括:A的音视频文件(.mp4)B的音视频文件(.mp4)C的音视频文件(.mp4)、一个A、B和C的混合音视频文件(.mp4)**,如果是纯音频通话,则没有相应的音视频文件。这些录制文件的地址在音视频通话结束之后会通过抄送服务抄送到您的服务器。

客户端录制支持录制单个通话者的音视频文件和录制通话的混合录音。

服务端录制

服务端录制客户端配置

参数 类型 说明
enableServerAudioRecording BOOL 服务器录制音频开关 (该开关仅在服务器开启录制功能时才有效)
enableServerVideoRecording BOOL 服务器录制视频开关 (该开关仅在服务器开启录制功能时才有效)
serverRecordingMode ENUM 0:参与混合录制也录制单人文件 1:参与混合录制 2:只录制单人文件
enableServerHostRecording BOOL 进入房间时设置此字段,是否为录制主讲人

视频录制布局目前提供默认的画廊模式,即等分模式,客户开通了录制功能,默认提供画廊模式。

- 当音视频房间参与视频合图人数为1人时,默认整个画面

- 当音视频房间参与视频合图人数为2人时,采用二宫格模式

- 当音视频房间参与视频合图人数为3或者4人时,采用四宫格模式

- 当音视频房间参与视频合图人数大于4人且小于等于9人时,采用九宫格模式

- 当音视频房间参与视频合图人数大于9人时,默认取前9个人视频画面合图

视频合图布局

描述 多人录制(销售后台) 音频录制(客户端) 视频录制(客户端) 录制模式
开关设置 老师:混合+单人录制,学生:混合录制
生成文件 / 混音aac文件x1 混屏mp4文件x1 视频mp4x1

服务器录制信息回调

音视频通话中,需要在 option 中 设置 serverRecordData 或 serverRecordAudio 参数后,通过该回调获取服务端录制信息。

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  网络通话服务器录制信息
 *
 *  @param info 录制信息
 */
- (void)onNetCallRecordingInfo:(NIMNetCallRecordingInfo *)info;
@end
参数 类型 说明
info NIMNetCallRecordingInfo 录制信息
- (void)onNetCallRecordingInfo:(NIMNetCallRecordingInfo *)info;
{
    //获取音频文件名
    NSString *audioFileName = info.audioRecordFileName;
    //获取视频文件名
    NSString *videoFileName = info.videoRecordFileName;
    //获取录制文件的 call id
    UInt64 callID = info.callID;
}

客户端录制

音视频录制

开始录制

通话建立以后,SDK 支持通过该接口将本端与对端的音视频图像和声音录制下来,保存成本地 mp4 格式文件。

@protocol NIMNetCallManager <NSObject>
/**
 *  开始MP4文件录制, 录制通话过程中自己的音视频内容到MP4文件
 *
 *  @param filePath     录制文件路径, SDK不负责创建目录, 请确保文件路径的合法性,
 *                      也可以传入nil, 由SDK自己选择文件路径
 *  @param videoBitrate 录制文件视频码率设置, 可以不指定, 由SDK自己选择合适的码率
 *
 *  @param userId       录制用户对象的id
 *
 *  @return 是否允许开始录制
 *
 *  @discussion 只有通话连接建立以后才允许开始录制
 */
- (BOOL)startRecording:(nullable NSURL *)filePath
          videoBitrate:(UInt32)videoBitrate
                   uid:(NSString *)userId;
@end
参数 类型 说明
filePath NSURL 录制文件路径, SDK不负责创建目录, 请确保文件路径的合法性, 也可以传入nil, 由SDK自己选择文件路径
videoBitrate UInt32 录制文件视频码率设置, 可以不指定, 由SDK自己选择合适的码率
userId NSString 录制用户对象的id
BOOL startAccepted;
//对自己进行视频录制
startAccepted = [[NIMAVChatSDK sharedSDK].netCallManager startRecording:filePath
                                                           videoBitrate:100000
                                                                    uid:[[NIMSDK sharedSDK].loginManager currentAccount]
结束录制

结束录制

@protocol NIMNetCallManager <NSObject>
/**
 *  停止MP4文件录制
 *
 *  @param userId 录制用户对象的id
 *
 *  @return 是否接受停止录制请求
 */
- (BOOL)stopRecordingWithUid:(NSString *)userId;
@end
参数 类型 说明
userId NSString 录制用户对象的id
//停止视频录制
[[NIMAVChatSDK sharedSDK].netCallManager stopRecordingWithUid:[[NIMSDK sharedSDK].loginManager currentAccount]];
录制成功开始回调

表示本地录制成功开始,携带录制对应的网络通话 ID 和录制文件路径以及用户 ID 信息。

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  录制成功开始
 *
 *  @param callID  录制的相关网络通话的call id
 *  @param fileURL 录制的文件路径
 *  @param userId  录制用户对象的id
 */
- (void)onRecordStarted:(UInt64)callID
                fileURL:(NSURL *)fileURL
                    uid:(NSString *)userId;
@end
参数 类型 说明
callID UInt64 录制的相关网络通话的call id
fileURL NSURL 录制的文件路径
userId NSString 录制用户对象的id
- (void)onRecordStarted:(UInt64)callID
                fileURL:(NSURL *)fileURL
                    uid:(NSString *)userId;
{
    if (self.callInfo.callID == callID) {
       //刷新UI
    }
}
录制发生错误回调

用户可以在录制过程中收该回调来获取本地录制发生的错误

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  录制发生了错误
 *
 *  @param error  错误
 *  @param callID 录制错误相关网络通话的call id
 *  @param userId 录制用户对象的id
 */
- (void)onRecordError:(NSError *)error
               callID:(UInt64)callID
                  uid:(NSString *)userId;
@end
参数 类型 说明
callID UInt64 录制的相关网络通话的call id
fileURL NSURL 录制的文件路径
userId NSString 录制用户对象的id
- (void)onRecordError:(NSError *)error
                    callID:(UInt64)callID
                       uid:(NSString *)userId;
{
    if (self.callInfo.callID == callID) {
       //刷新UI
    }
}
录制成功结束回调

表示本地录制成功结束,携带录制对应的网络通话 ID 和录制文件路径以及用户 ID 信息。

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  录制发生了错误
 *
 *  @param error  错误
 *  @param callID 录制错误相关网络通话的call id
 *  @param userId 录制用户对象的id
 */
- (void)onRecordError:(NSError *)error
               callID:(UInt64)callID
                  uid:(NSString *)userId;
@end
参数 类型 说明
callID UInt64 录制的相关网络通话的call id
fileURL NSURL 录制的文件路径
userId NSString 录制用户对象的id
- (void)onRecordStopped:(UInt64)callID
                      fileURL:(NSURL *)fileURL
                          uid:(NSString *)userId;
{
    if (self.callInfo.callID == callID) {
       //刷新UI
    }
}

通话录音

开始通话录音

通话建立以后,SDK 支持通过该接口录制通话中所有参与者的声音,包含混音任务播放的声音,保存成本地 aac 或 wav 格式文件。

@protocol NIMNetCallManager <NSObject>
/**
 开始通话录音. 录制通话中所有参与者的声音, 包含混音任务播放的声音, 录制成 aac 或者 wav 文件

 @param filePath 录制文件路径, 不包含文件类型后缀. 包含文件类型后缀的完整文件路径可以在开始录制以后通过 currentAudioRecordingFilePath 查询.

 @discussion SDK不负责创建目录, 请确保文件路径的合法性, 也可以传入 nil, 由 SDK 自己选择文件路径

 @param error 错误. 如果开始通话录音失败, 此处回填错误码

 @return 开始通话录音的结果.
 */
- (BOOL)startAudioRecording:(nullable NSURL *)filePath
                      error:(NSError * __nullable *)error;
@end
参数 类型 说明
filePath NSURL 录制文件路径, 不包含文件类型后缀. 包含文件类型后缀的完整文件路径可以在开始录制以后通过 currentAudioRecordingFilePath 查询
error NSError 错误. 如果开始通话录音失败, 此处回填错误码
NSString * pathComponent = @"record_audio";
NSURL *filePath = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:pathComponent];

//开始通话录音
[[NIMAVChatSDK sharedSDK].netCallManager startAudioRecording:filePath error:nil];
结束通话录音

结束通话录音

@protocol NIMNetCallManager <NSObject>
/**
 结束通话录音
 */
- (void)stopAudioRecording;
@end
//结束通话录音
[[NIMAVChatSDK sharedSDK].netCallManager stopAudioRecording];
获取当前通话录音文件路径

获取当前通话录音文件路径

@protocol NIMNetCallManager <NSObject>
/**
 获取当前通话录音文件路径

 @return 当前通话录音文件路径. 如果没有进行中的通话录音则返回 nil
 */
- (nullable NSURL *)currentAudioRecordingFilePath;
@end
NSURL *filePath =  [[NIMAVChatSDK sharedSDK].netCallManager currentAudioRecordingFilePath];