为了保证最佳体验效果,本场景需要集成火山引擎的RTC SDK 以及点播播放器 SDK 并且使用内容定制云服务,您需要在 RTC、点播、内容定制的控制台开通服务,相应开通指南如下:
1、RTC SDK总体接入流程,详细步骤请参看 RTC服务开通指南

2、点播 SDK接入流程,详细步骤请参看点播控制台服务开通
3、内容定制接入流程,详细步骤请参看内容定制控制台服务开通


/**
* 加入RTC房间并初始化参数
* @param token: RTC Token
* @param roomID: RTC room id
* @param uid: RTC user id
**/
- (void)joinRTCRoomWithToken:(NSString *)token
roomID:(NSString *)roomID
uid:(NSString *)uid {
// 初始化 ByteRTCVideo 对象
self.rtcEngineKit = [ByteRTCVideo createRTCVideo:APPID
delegate:self
parameters:@{}];
// 初始化 ByteRTCRoom 对象
self.rtcRoom = [self.rtcEngineKit createRTCRoom:roomID];
self.rtcRoom.delegate = self;
// 设置为可见
[self.rtcRoom setUserVisibility:YES];
// 加入房间需要开启麦克风、相机,观众需要关闭麦克风、相机
[self.rtcEngineKit startVideoCapture];
[self.rtcEngineKit startAudioCapture];
// 设置本地渲染和编码镜像
[self.rtcEngineKit setLocalVideoMirrorType:ByteRTCMirrorTypeRenderAndEncoder];
// 绑定本地视频预览视图
UIView *view = [[UIView alloc] init];
ByteRTCVideoCanvas *videoCanvas = [[ByteRTCVideoCanvas alloc] init];
videoCanvas.uid = uid;
videoCanvas.renderMode = ByteRTCRenderModeHidden;
videoCanvas.view = view;
[self.rtcEngineKit setLocalVideoCanvas:ByteRTCStreamIndexMain
withCanvas:videoCanvas];
// 设置音频场景类型
[self.rtcEngineKit setAudioScenario:ByteRTCAudioScenarioCommunication];
// 开启发言者音量监听
ByteRTCAudioPropertiesConfig *audioPropertiesConfig = [[ByteRTCAudioPropertiesConfig alloc] init];
audioPropertiesConfig.interval = 300;
[self.rtcEngineKit enableAudioPropertiesReport:audioPropertiesConfig];
// 加入房间,开始连麦,需要申请AppId和Token
ByteRTCUserInfo *userInfo = [[ByteRTCUserInfo alloc] init];
userInfo.userId = uid;
ByteRTCRoomConfig *config = [[ByteRTCRoomConfig alloc] init];
config.profile = ByteRTCRoomProfileLwTogether;
config.isAutoPublish = YES;
config.isAutoSubscribeAudio = YES;
config.isAutoSubscribeVideo = YES;
[self.rtcRoom joinRoom:token
userInfo:userInfo
roomConfig:config];
}
Objective-C
- (void)rtcRoom:(ByteRTCRoom *)rtcRoom onRoomStateChanged:(NSString *)roomId
withUid:(NSString *)uid
state:(NSInteger)state
extraInfo:(NSString *)extraInfo {
// 收到 RTC 加入房间结果
}
- (void)rtcRoom:(ByteRTCRoom *)rtcRoom onUserJoined:(ByteRTCUserInfo *)userInfo elapsed:(NSInteger)elapsed {
// 收到远端用户加入房间回调
}
- (void)rtcEngine:(ByteRTCVideo *)engine onLocalAudioPropertiesReport:(NSArray<ByteRTCLocalAudioPropertiesInfo *> *)audioPropertiesInfos {
// 本地用户音量回调
}
- (void)rtcEngine:(ByteRTCVideo *)engine onRemoteAudioPropertiesReport:(NSArray<ByteRTCRemoteAudioPropertiesInfo *> *)audioPropertiesInfos
totalRemoteVolume:(NSInteger)totalRemoteVolume {
// 远端用户音量回调
}
/**
* 房间内新增远端摄像头/麦克风采集的媒体流流的回调
*/
- (void)rtcRoom:( ByteRTCRoom *)rtcRoom onUserPublishStream:(NSString *)userId type:(ByteRTCMediaStreamType)type {
if (type == ByteRTCMediaStreamTypeAudio) {
return;
}
// 绑定远端用户视频视图
UIView *view = [[UIView alloc] init];
ByteRTCVideoCanvas *videoCanvas = [[ByteRTCVideoCanvas alloc] init];
videoCanvas.renderMode = ByteRTCRenderModeHidden;
videoCanvas.view = view;
ByteRTCRemoteStreamKey *streamKey = [[ByteRTCRemoteStreamKey alloc] init];
streamKey.userId = userId;
streamKey.roomId = self.rtcRoom.getRoomId;
streamKey.streamIndex = ByteRTCStreamIndexMain;
[self.rtcEngineKit setRemoteVideoCanvas:streamKey withCanvas:videoCanvas];
}
Objective-C注意:内容服务的接入及详细使用,可参考: 应用管理手册

/**
* 开启PCM混音
* @param mixId 混音ID。用于标识混音,保证混音 ID 唯一性。 如果使用相同的 ID 重复调用本*方法后,前一次混音会停止,后一次混音开始。
*/
- (void)startAudioMixing:(int)mixId {
// 开启本地混音播放
ByteRTCAudioMixingManager *manager = [self.rtcEngineKit getAudioMixingManager];
[manager enableAudioMixingFrame:mixId type:ByteRTCAudioMixingTypePlayout];
}
/**
* 播放器音频数据回调,推送音频数据到RTC
*/
- (void)pushAudioMixingFrame:(int)mixId audioFrame:(ByteRTCAudioFrame *)audioFrame {
// 将播放器回调出的数据送入RTC播放
ByteRTCAudioMixingManager *manager = [self.rtcEngineKit getAudioMixingManager];
[manager pushAudioMixingFrame:mixId audioFrame:audioFrame];
}
/**
* 关闭PCM混音
*/
- (void)stopAudioMixing:(int)mixId {
// 关闭混音
ByteRTCAudioMixingManager *manager = [self.rtcEngineKit getAudioMixingManager];
[manager disableAudioMixingFrame:mixId];
}
/**
* 发送房间广播消息
*/
- (void)sendRoomMessage:(NSString *)message {
// 发送同步消息
// 房主讲当前视频的播放进度及播放状态发送给房间内所有观众
[self.rtcRoom sendRoomMessage:string];
}
Objective-C- (void)rtcRoom:(ByteRTCRoom *)rtcRoom onRoomMessageReceived:(NSString *)uid message:(NSString *)message {
// 收到同步消息
// 观众收到房主发送的播放状态与本地播放状态进行对比并修正,保持同步
}
Objective-C
/**
* 调节混音的音量大小,包括音频文件混音和 PCM 混音。
* @param mixId 混音 ID
* @param volume 混音音量相对原音量的比值。范围为 `[0, 400]`,建议范围是 `[0, 100]`。
*/
- (void)setAudioMixingVolume:(int)mixId volume:(int)volume {
ByteRTCAudioMixingManager *audioMixingManager = [self.rtcEngineKit getAudioMixingManager];
[audioMixingManager setAudioMixingVolume:mixId volume:volume type:ByteRTCAudioMixingTypePlayout];
}
/**
* 调节本地播放的所有远端用户混音后的音量。播放音频前或播放音频时,你都可以使用此接口设定播放音量。
* @param volume 音频播放音量值和原始音量的比值,范围是 [0, 400],单位为 %,自带溢出保护。
*/
- (void)setPlaybackVolume:(NSInteger)volume {
[self.rtcEngineKit setPlaybackVolume:volume];
}
Objective-C| 功能点 | API |
|---|---|
| 创建 RTCVideo 对象 | createRTCVideo:delegate:parameters: |
| 创建 RTCRoom 对象 | createRTCRoom: |
| 设置用户可见性 | setUserVisibility: |
| 设置本地渲染和编码镜像 | setLocalVideoMirrorType: |
| 设置本地视频渲染视图 | setLocalVideoCanvas:withCanvas |
| 设置音频场景类型 | setAudioScenario: |
| 启用音频信息提示 | enableAudioPropertiesReport: |
| 开启本地音频采集 | startAudioCapture |
| 开启本地视频采集 | startVideoCapture |
| 加入RTC 房间 | joinRoom:userInfo:roomConfig: |
| 设置远端用户视频渲染视图 | setRemoteVideoCanvas:withCanvas: |
| 开启PCM 音频数据混音 | enableAudioMixingFrame:type: |
| 推送 PCM 音频帧数据用于混音 | pushAudioMixingFrame:audioFrame: |
| 调节混音的音量大小 | setAudioMixingVolume:volume:type: |
| 关闭PCM 混音 | disableAudioMixingFrame: |
| 给房间内的所有其他用户发送文本消息 | sendRoomMessage: |
| 调节远端用户用通话音量 | setPlaybackVolume: |
| 打开音量闪避功能 | enablePlaybackDucking: |
| 离开房间 | leaveRoom |
| 销毁 RTCRoom 对象 | destroy |
| 关闭内部音频采集 | stopAudioCapture |
| 关闭内部视频采集 | stopVideoCapture |
| 销毁 RTCVideo 对象 | destroy |
| 功能点 | 回调 |
|---|---|
| 本地用户加入 RTC 房间回调 | rtcRoom:onRoomStateChanged:uid:state:extraInfo |
| 音频播放路由变化时,收到该回调 | rtcEngine:onAudioRouteChanged: |
| 本地用户音量回调 | rtcEngine:onLocalAudioPropertiesReport: |
| 远端用户音量回调 | rtcEngine:onRemoteAudioPropertiesReport:totalRemoteVolume: |
| 远端用户加入 RTC 回调 | rtcRoom:onUserJoined:elapsed: |
| 房间内新增远端媒体流回调 | rtcRoom:onUserPublishStream:type: |
| 收到房间内广播文本消息回调 | rtcRoom:onRoomMessageReceived:message: |