2025/06/30 15:31:13
单流录制和合流录制
功能简介
为支持不同的录制业务需求,本地服务端录制 SDK 支持单流和合流两种录制模式,其中:
- 单流录制,指对频道内不同的主播发出的流,根据 UID 进行区别然后分别进行录制,产生不同的录制文件。
- 合流录制,指将频道内全部主播的音视频合流录制到一起,只生成一个录制文件。
本文介绍如何使用录制 4.x SDK 分别实现单流录制和合流录制。
前提条件
开始前,请确保你已参考快速开始集成了录制 SDK,并实现了极简的录制功能。
实现单流或合流录制的步骤,和快速开始中一致,不同的是参数的设置,以及不同录制模式下可以调用的 API。因此开始前请确保你了解实现基础录制功能所需要的步骤。
实现单流录制
单流录制完整的 API 时序如下图所示:
其中,关键步骤和参数设置如下:
- 初始化录制实例时,将
enable_mix
参数设为false
,表示使用单流录制; - 调用
subscribe
系列方法订阅你想要录制的用户; - 加入频道,并接收远端用户加入频道的回调
onUserJoined
,获取其中的uid
参数用于后续设置; - 根据需求,调用
setRecorderConfigByUid
设置单流录制的配置项;调用enableAndUpdateUpdateVideoWatermarksByUid
添加录制水印; - 调用单流录制对应的 API 开始/结束单流录制:
startSingleRecordingByUid
:开始单流录制stopSingleRecordingByUid
:停止单流录制
示例代码如下:
C++
// ...
// enable_mix 设为false,启用单流录制模式
recorder->initialize(service, false);
// 设置音频订阅逻辑
recorder->subscribeAllAudio();
recorder->subscribeAllVideo(options);
// 加入频道
recorder->joinChannel(config.token.c_str(), config.ChannelName.c_str(), config.UserId.c_str());
// 在收到 onUserjoined 回调后,可以针对 uid 设置 recorder config
agora::media::MediaRecorderConfiguration config;
config.fps = config_.video.fps;
config.width = config_.video.width;
config.height = config_.video.height;
config.channel_num = config_.audio.numOfChannels;
config.sample_rate = config_.audio.sampleRate;
std::string curTime = getCurrentTimeAsString();
std::string storagePath = config_.recorderPath + std::string(uid) + "_" + curTime + ".mp4";
config.storagePath = storagePath.c_str();
config.streamType = static_cast<agora::media::MediaRecorderStreamType>(config_.recorderStreamType) ;
config.maxDurationMs = config_.maxDuration * 1000;
recorder_->setRecorderConfigByUid(config, uid);
// 设置水印
recorder_->enableAndUpdateVideoWatermarksByUid(watermarks, config_.waterMarks.size(), uid);
// 开始录制
recorder_->startSingleRecordingByUid(uid);
// ...
// 停止录制
recorder_->stopSingleRecordingByUid(uid);
实现合流录制
合流录制完整 API 时序如下图所示:
其中,关键步骤和参数设置如下:
- 初始化录制实例时,将
enable_mix
参数设为true
,表示使用合流录制; - 调用
subscribe
系列方法订阅你想要录制的用户; - 加入频道后,根据需求调用
setRecroderConfig
、setVideoMixingLayout
、enableAndUpdateVideoWatermarks
设置合流录制的配置项、合流布局、水印等; - 调用合流录制对应的 API 开始/结束合流录制:
startRecording
:开始合流录制stopRecording
:停止合流录制
示例代码如下:
C++
// ...
// enable_mix 设为 true,启用合流录制模式
recorder->initialize(service, true);
// 设置订阅逻辑
recorder->subscribeAllAudio();
recorder->subscribeAllVideo();
// 加入频道
recorder->joinChannel(config.token.c_str(), config.ChannelName.c_str(), config.UserId.c_str());
// 设置合流录制 config、水印 config、合流的渲染布局
recorder->setRecorderConfig(recorder_config);
recorder->enableAndUpdateVideoWatermarks(watermarks, config.waterMarks.size());
recorder->setVideoMixingLayout(layout);
// 开始录制
recorder->startRecording();
// ...
// 停止录制
recorder->stopRecording();
开发注意事项
如果你使用了单流录制模式,调用如下方法不生效:
setRecorderConfig
enableAndUpdateVideoWatermarks
setVideoMixingLayout
startRecording
stopRecording
如果你使用了合流录制模式,调用如下方法不生效:
setRecorderConfigByUid
enableAndUpdateVideoWatermarksByUid
startRecordingByUid
stopRecordingByUid