Agora supports video mixing. You can mix video tracks from multiple remote or local users and output the video in customized format.
Refer to the following steps to implement video mixing.
IVideoMixerSource
object and call setBackground
to set the background.agora::agora_refptr<agora::rtc::IVideoMixerSource> videoMixer = factory->createVideoMixer();
videoMixer->setBackground(1920, 1080, 15);
createMixedVideoTrack
to create a mixed video track. Use the mixed video track to register a video frame observer.agora::agora_refptr<agora::rtc::ILocalVideoTrack> mixVideoTrack =
service->createMixedVideoTrack(videoMixer);
if (!mixVideoTrack) {
AG_LOG(ERROR, "Failed to create video track!");
return -1;
}
agora::rtc::VideoEncoderConfiguration encoderConfig;
encoderConfig.codecType = agora::rtc::VIDEO_CODEC_H264;
encoderConfig.dimensions.width = 1920;
encoderConfig.dimensions.height = 1080;
encoderConfig.frameRate = 15;
mixVideoTrack->setVideoEncoderConfiguration(encoderConfig);
// Register video frame observer to receive video stream
agora::agora_refptr<agora::rtc::IVideoSinkBase> yuvFrameObserver =
new agora::RefCountedObject<YuvFrameObserver>(options.videoFile);
mixVideoTrack->addRenderer(yuvFrameObserver.get());
IVideoMixerSource
for video mixing.if (remote_video_track_ && video_mixer_ && enable_video_mix_) {
video_mixer_->addVideoTrack(userId, remote_video_track_);
remote_video_track_map_[std::string(userId)] = remote_video_track_;
}
IVideoMixerSource
object.remote_source_map_[std::string(userId)] = calculate_layout(width,height);
for (auto it = remote_source_map_.begin(); it != remote_source_map_.end(); it++) {
video_mixer_->setStreamLayout(it->first.c_str(), it->second);
}
video_mixer_->refresh();