会议录制功能提供了云端录制和本地录制两种方式,支持将会议的音视频内容、屏幕共享等内容进行录制保存。云端录制将内容存储在云端,本地录制将内容保存在本地设备上,为用户提供灵活的录制选择。
在会议中启用云端录制:
// 开启云端录制 - 开始云端录制,挂断时自动停止
NemoSdkAdaptor::getInstance()->startCloudRecord(true);
// 停止云端录制 - 手动停止云端录制
NemoSdkAdaptor::getInstance()->stopCloudRecord();
在Windows平台上进行本地录制:
// 设置录制文件保存路径 - 设置录制文件存储目录
NemoSdkAdaptor::getInstance()->setRecordingsFilePath("C:/Recordings/");
// 开始本地录制 - 需要传入完整的录制参数
NemoSdkAdaptor::getInstance()->startLocalRecord("bizId", XYLocalRecordType_Video, XYLocalRecordMode_Manual, XYVideoResolution_720P, false, rbInfo);
// 更新录制布局 - 设置为画廊模式布局
XYLocalRecordLayout layout;
layout.mode = XYLayoutMode_Gallery;
NemoSdkAdaptor::getInstance()->updateLocalRecordLayout(layout);
// 停止本地录制 - 停止本地录制功能
NemoSdkAdaptor::getInstance()->stopLocalRecord();
管理录制文件:
// 获取即将过期的录制文件 - 请求即将过期的录制文件通知
NemoSdkAdaptor::getInstance()->nearExpireVodNoticeRequest();
API: startCloudRecord
接口定义:
virtual void startCloudRecord(bool autoStopByDropCall = true) = 0;
参数:
autoStopByDropCall
(bool): 是否在挂断会议时自动停止录制,默认为true示例:
NemoSdkAdaptor::getInstance()->startCloudRecord(true);
API: stopCloudRecord
接口定义:
virtual void stopCloudRecord() = 0;
示例:
NemoSdkAdaptor::getInstance()->stopCloudRecord();
API: startLocalRecord
接口定义:
virtual void startLocalRecord(const char* bizId,
XYLocalRecordType type,
XYLocalRecordMode mode,
XYVideoResolution res,
bool toUpload,
const XYLocalRecordBusinessInfo& rbInfo) = 0;
参数:
bizId
(const char*): 本地生成的唯一ID,通常使用UUIDtype
(XYLocalRecordType): 本地录制类型mode
(XYLocalRecordMode): 本地录制模式res
(XYVideoResolution): 本地录制视频质量toUpload
(bool): 是否上传服务器rbInfo
(XYLocalRecordBusinessInfo&): 本地录制的额外业务信息示例:
XYLocalRecordBusinessInfo rbInfo;
rbInfo.meetingId = "meeting123";
rbInfo.userId = "user456";
NemoSdkAdaptor::getInstance()->startLocalRecord(
"biz123",
XYLocalRecordType_Video,
XYLocalRecordMode_All,
XYVideoResolution_720P,
true,
rbInfo
);
API: stopLocalRecord
接口定义:
virtual void stopLocalRecord(const char* bizId) = 0;
参数:
bizId
(const char*): 开始录制时传入的ID示例:
NemoSdkAdaptor::getInstance()->stopLocalRecord("biz123");
接口定义:
virtual void setRecordingsFilePath(const XYLocalRecordStorePath& filePath) = 0;
参数:
filePath
(XYLocalRecordStorePath&): 文件保存路径示例:
XYLocalRecordStorePath filePath;
filePath.path = "C:/Recordings/";
NemoSdkAdaptor::getInstance()->setRecordingsFilePath(filePath);
// 设置录制文件保存路径
NemoSdkAdaptor::getInstance()->setRecordingsFilePath("C:/MeetingRecordings/");
// 设置相对路径
NemoSdkAdaptor::getInstance()->setRecordingsFilePath("./recordings/");
#### 更新本地录制布局
**API**: [updateLocalRecordLayout](/common/meeting/api/meeting_record?platform=cppsdk#WCxA8)
**接口定义:**
```cpp
virtual void updateLocalRecordLayout(const XYLocalRecordLayout& layout) = 0;
参数:
layout
(XYLocalRecordLayout&): 录制布局配置示例:
// 设置画廊模式布局
XYLocalRecordLayout layout;
layout.mode = XYLayoutMode_Gallery;
layout.resolution = XYResolution_1080P;
NemoSdkAdaptor::getInstance()->updateLocalRecordLayout(layout);
// 设置演讲者模式布局
layout.mode = XYLayoutMode_Speaker;
layout.resolution = XYResolution_720P;
NemoSdkAdaptor::getInstance()->updateLocalRecordLayout(layout);
API: nearExpireVodNoticeRequest
接口定义:
virtual void nearExpireVodNoticeRequest(bool confirm, bool noMore, bool viewDetail) = 0;
参数:
confirm
(bool): 确定事件操作noMore
(bool): 本周不再提醒viewDetail
(bool): 查看详情操作示例:
NemoSdkAdaptor::getInstance()->nearExpireVodNoticeRequest(true, false, true);
class MeetingRecordManager {
private:
bool _isCloudRecording = false;
bool _isLocalRecording = false;
QString _recordingsPath = "./recordings/";
XYLocalRecordLayout _currentLayout;
public:
// 云端录制控制
void startCloudRecording() {
if (!_isCloudRecording) {
NemoSdkAdaptor::getInstance()->startCloudRecord();
_isCloudRecording = true;
}
}
void stopCloudRecording() {
if (_isCloudRecording) {
NemoSdkAdaptor::getInstance()->stopCloudRecord();
_isCloudRecording = false;
}
}
// 本地录制控制
void setRecordingsPath(const QString& path) {
_recordingsPath = path;
NemoSdkAdaptor::getInstance()->setRecordingsFilePath(path.toStdString());
}
void startLocalRecording() {
if (!_isLocalRecording) {
NemoSdkAdaptor::getInstance()->startLocalRecord();
_isLocalRecording = true;
}
}
void stopLocalRecording() {
if (_isLocalRecording) {
NemoSdkAdaptor::getInstance()->stopLocalRecord();
_isLocalRecording = false;
}
}
void updateRecordingLayout(XYLayoutMode mode, XYResolution resolution = XYResolution_1080P) {
_currentLayout.mode = mode;
_currentLayout.resolution = resolution;
NemoSdkAdaptor::getInstance()->updateLocalRecordLayout(_currentLayout);
}
void requestExpiringRecordings() {
NemoSdkAdaptor::getInstance()->nearExpireVodNoticeRequest();
}
// 云端录制回调
void onRecordResult(const XYString& code, const XYString& recordInfo) {
QString errCode(code.str());
QString info(recordInfo.str());
if (errCode == SDKError_NoError) {
qDebug() << "Cloud record result:" << info;
emit cloudRecordResult(info);
} else {
qDebug() << "Cloud record failed:" << errCode;
emit cloudRecordFailed(errCode);
}
}
void onRecordErrorResult(const XYString& code, const XYString& errorInfo) {
QString errCode(code.str());
QString info(errorInfo.str());
qDebug() << "Cloud record error:" << errCode << ", info:" << info;
emit cloudRecordError(errCode, info);
}
void onRecordingStateChanged(const XYString& state) {
QString stateStr(state.str());
qDebug() << "Recording state changed:" << stateStr;
emit recordingStateChanged(stateStr);
}
void onRecordStatusNotification(const XYString& notification) {
QString notificationStr(notification.str());
qDebug() << "Record status notification:" << notificationStr;
emit recordStatusNotification(notificationStr);
}
// 本地录制回调
void onLocalRecordStatusChanged(const XYString& status) {
QString statusStr(status.str());
qDebug() << "Local record status changed:" << statusStr;
emit localRecordStatusChanged(statusStr);
}
void onLocalRecordResult(const XYString& code, const XYString& result) {
QString errCode(code.str());
QString resultStr(result.str());
if (errCode == SDKError_NoError) {
qDebug() << "Local record result:" << resultStr;
emit localRecordResult(resultStr);
} else {
qDebug() << "Local record failed:" << errCode;
emit localRecordFailed(errCode);
}
}
void onLocalRecordDbChanged(const XYString& dbInfo) {
QString info(dbInfo.str());
qDebug() << "Local record DB changed:" << info;
emit localRecordDbChanged(info);
}
// 录制权限回调
void onCloudRecordPermissionChanged(const XYString& permission) {
QString permissionStr(permission.str());
qDebug() << "Cloud record permission changed:" << permissionStr;
emit cloudRecordPermissionChanged(permissionStr);
}
// 文件过期回调
void onNearExpiredVodNoticeInfo(const XYString& noticeInfo) {
QString info(noticeInfo.str());
qDebug() << "Near expired VOD notice:" << info;
emit nearExpiredVodNotice(info);
}
// Getter方法
bool isCloudRecording() const { return _isCloudRecording; }
bool isLocalRecording() const { return _isLocalRecording; }
QString getRecordingsPath() const { return _recordingsPath; }
XYLocalRecordLayout getCurrentLayout() const { return _currentLayout; }
};
模式 | 说明 |
| 画廊模式 - 显示多个参会者 |
| 演讲者模式 - 突出显示当前发言者 |
| 全屏模式 - 全屏显示内容 |
| 自定义模式 - 自定义布局 |
分辨率 | 说明 |
| 720P (1280x720) |
| 1080P (1920x1080) |
| 4K (3840x2160) |
云端录制功能将会议内容存储在云端服务器,包括:
本地录制功能将会议内容保存在本地设备,包括:
会议录制功能支持多种特性,包括:
方法 | 描述 | 链接 |
开启云端录制 | ||
关闭云端录制 | ||
开始本地录制(仅支持Windows) | ||
停止本地录制(仅支持Windows) | ||
更新本地录制布局信息(仅支持Windows) | ||
设置本地录制文件保存路径(仅支持Windows) | ||
获取录制过期文件 |
回调 | 描述 | 链接 |
云端录制结果回调 | ||
云端录制错误回调 | ||
录制状态通知回调 | ||
录制状态变化回调 | ||
本地录制状态变化回调 | ||
本地录制结果回调 | ||
本地录制数据库变化回调 | ||
云端录制权限变化回调 | ||
即将过期录制文件通知回调 |
枚举 | 描述 | 链接 |
布局模式枚举 | ||
分辨率枚举 |
数据结构 | 描述 | 链接 |
本地录制布局配置 |