单流录制和合流录制

  • C++

更新时间不可用

了解本地服务端录制在不同平台上的单流录制和合流录制方式,包括接入流程、关键配置和平台差异。

功能简介

为支持不同的录制业务需求,本地服务端录制 SDK 支持单流和合流两种录制模式,其中:

  • 单流录制,指对频道内不同的主播发出的流,根据用户 ID 进行区分并分别录制,产生不同的录制文件。
  • 合流录制,指将频道内全部主播的音视频合流录制到一起,只生成一个录制文件。

前提条件

开始前,请确保你已参考快速开始集成了录制 SDK,并实现了极简的录制功能。

实现单流或合流录制的步骤,和快速开始中一致,不同的是参数的设置,以及不同录制模式下可以调用的 API。因此开始前请确保你了解实现基础录制功能所需要的步骤。

实现单流录制

单流录制完整的 API 时序如下图所示:

其中,关键步骤和参数设置如下:

  • 初始化录制实例时,将 enable_mix 参数设为 false,表示使用单流录制;
  • 调用 subscribe 系列方法订阅你想要录制的用户;
  • 加入频道,并接收远端用户加入频道的回调 onUserJoined,获取其中的 uid 参数用于后续设置;
  • 根据需求,调用 setRecorderConfigByUid 设置单流录制的配置项;调用 enableAndUpdateUpdateVideoWatermarksByUid 添加录制水印;
  • 调用单流录制对应的 API 开始/结束单流录制:

示例代码如下:

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 时序如下图所示:

其中,关键步骤和参数设置如下:

示例代码如下:

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

参考信息