- (void)startMixStreamRetweetWithPushUrl:(NSString *)pushUrl
rtcUid:(NSString *)rtcUid
rtcRoomId:(NSString *)rtcRoomId {
if (NOEmptyStr(pushUrl)) {
// Initialize the ByteRTCVideo object
self.rtcEngineKit = [ByteRTCVideo createRTCVideo:appID
// Initialize the ByteRTCRoom object
self.rtcRoom = [self.rtcEngineKit createRTCRoom:rtcRoomID];
self.rtcRoom.delegate = self;
ByteRTCUserInfo *userInfo = [[ByteRTCUserInfo alloc] init];
userInfo.userId = userID;
ByteRTCRoomConfig *config = [[ByteRTCRoomConfig alloc] init];
config.profile = ByteRTCRoomProfileLiveBroadcasting;
config.isAutoPublish = YES;
config.isAutoSubscribeAudio = YES;
config.isAutoSubscribeVideo = YES;
[self.rtcRoom joinRoom:token
// Set the video capture config
ByteRTCVideoCaptureConfig *captureConfig = [[ByteRTCVideoCaptureConfig alloc] init];
captureConfig.videoSize = CGSizeMake(720, 1280);
captureConfig.frameRate = 15;
[self.rtcEngineKit setVideoCaptureConfig:captureConfig];
// Set the video encoder config
ByteRTCVideoEncoderConfig *encoderConfig = [[ByteRTCVideoEncoderConfig alloc] init];
encoderConfig.videoSize = videoSize;
encoderConfig.frameRate = frameRate;
encoderConfig.maxKbps = maxKbps;
[self.rtcEngineKit setMaxVideoEncoderConfig:encoderConfig];
// Start video and audio capture
[self.rtcEngineKit startVideoCapture];
[self.rtcEngineKit startAudioCapture];
// Join RTC room succeed delegate
- (void)rtcRoom:(ByteRTCRoom *)rtcRoom onRoomStateChanged:(NSString *)roomId withUid:(NSString *)uid state:(NSInteger)state extraInfo:(NSString *)extraInfo {
// 收到 RTC 入房成功回调之后,开始合流转推
// After receiving the successful callback of RTC entry, start to merge and retweet
[self startLiveTranscoding];
- (void)startLiveTranscoding {
// Get the layout of the confluence retweet video stream
NSArray *regions = [self getRegionWithUserId:rtcUid
// Confluence retweet Setting
self.mixedStreamConfig = [ByteRTCMixedStreamConfig defaultMixedStreamConfig];
self.mixedStreamConfig.layoutConfig.regions = regions;
self.mixedStreamConfig.roomID = rtcRoomId;
self.mixedStreamConfig.userID = [LocalUserComponents userModel].uid;
self.mixedStreamConfig.pushURL = pushUrl;
self.mixedStreamConfig.expectedMixingType = ByteRTCMixedStreamByServer;
self.mixedStreamConfig.audioConfig.sampleRate = 44100;
self.mixedStreamConfig.audioConfig.channels = 2;
self.mixedStreamConfig.videoConfig.fps = frameRate;
self.mixedStreamConfig.videoConfig.bitrate = maxKbps;
self.mixedStreamConfig.videoConfig.width = videoSize.width;
self.mixedStreamConfig.videoConfig.height = videoSize.height;
self.mixedStreamConfig.layoutConfig.userConfigExtraInfo = @"json";
[self.rtcEngineKit startPushMixedStreamToCDN:@""
mixedConfig:self.mixedStreamConfig
- (NSArray *)getRegionWithUserId:(NSString *)userId
rtcRoomId:(NSString *)rtcRoomId {
NSInteger audienceIndex = 0;
NSMutableArray *list = [[NSMutableArray alloc] init];
ByteRTCMixedStreamLayoutRegionConfig *region = [[ByteRTCMixedStreamLayoutRegionConfig alloc] init];
region.roomID = rtcRoomId;
region.isLocalUser = [userModel.uid isEqualToString:[LocalUserComponents userModel].uid] ? YES : NO;
region.renderMode = ByteRTCMixedStreamRenderModeHidden;
region.width = videoSize.width;//合流转推设置分辨率的宽
region.height = videoSize.height;//合流转推设置分辨率的高
[list addObject:region];