为了保证最佳体验效果,本场景需要集成火山引擎的 RTC SDK 以及 HIFIVE 音乐开放平台的SDK,您需要在 RTC、HIFIVE的控制台开通服务,相应开通指南如下:
当前仅提供了你已通过其他渠道获取音乐文件时,实现 KTV 场景的参考实现。RTC 也提供从曲库接入到 KTV 场景的完整能力,如果希望获取参考文档,请咨询技术支持。
/** * 加入RTC房间并初始化参数 * @param token: RTC Token * @param roomID: RTC room id * @param uid: RTC user id * @param isHost: YES 业务上主播 ; NO 业务上观众 **/ - (void)joinRTCRoomWithToken:(NSString *)token roomID:(NSString *)roomID uid:(NSString *)uid isHost:(BOOL)isHost { // 初始化 ByteRTCVideo 对象 self.rtcEngineKit = [ByteRTCVideo createRTCVideo:APPID delegate:self parameters:@{}]; // 初始化 ByteRTCRoom 对象 self.rtcRoom = [self.rtcEngineKit createRTCRoom:roomID]; self.rtcRoom.delegate = self; // 设置音频场景类型 Music [self.rtcEngineKit setAudioScenario:ByteRTCAudioScenarioMusic]; // 设置音频双声道音乐音质 [self.rtcEngineKit setAudioProfile:ByteRTCAudioProfileHD]; // 设置主播为可见,观众为隐身 [self.rtcRoom setUserVisibility:isHost ? YES : NO]; // 加入房间时主播需要开启麦克风,观众需要关闭麦克风 if (isHost) { [self.rtcEngineKit startAudioCapture]; } else { [self.rtcEngineKit stopAudioCapture]; } // 设置音频路由模式 [self.rtcEngineKit setDefaultAudioRoute:ByteRTCAudioRouteSpeakerphone]; // 开启发言者音量监听 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 = ByteRTCRoomProfileKTV; config.isAutoPublish = YES; config.isAutoSubscribeAudio = YES; [self.rtcRoom joinRoom:token userInfo:userInfo roomConfig:config]; }
- (void)rtcRoom:(ByteRTCRoom *)rtcRoom onRoomStateChanged:(NSString *)roomId withUid:(NSString *)uid state:(NSInteger)state extraInfo:(NSString *)extraInfo { // 收到 RTC 加入房间结果 } - (void)rtcEngine:(ByteRTCVideo *)engine onLocalAudioPropertiesReport:(NSArray<ByteRTCLocalAudioPropertiesInfo *> *)audioPropertiesInfos { // 本地用户音量回调 } - (void)rtcEngine:(ByteRTCVideo *)engine onRemoteAudioPropertiesReport:(NSArray<ByteRTCRemoteAudioPropertiesInfo *> *)audioPropertiesInfos totalRemoteVolume:(NSInteger)totalRemoteVolume { // 远端用户音量回调 }
/** * 开始演唱。在歌词/歌曲下载完成,收到开始演唱广播后执行。 * @param filePath 歌曲的文件路径 */ - (void)startStartSinging:(NSString *)filePath { ByteRTCMediaPlayer *mediaPlayer = [self.rtcEngineKit getMediaPlayer:0]; ByteRTCMediaPlayerConfig *config = [[ByteRTCMediaPlayerConfig alloc]init]; config.autoPlay = YES; // 设置歌曲本地播放和推送到远端 config.type = ByteRTCAudioMixingTypePlayoutAndPublish; // 设置歌曲播放一次 config.playCount = 1; // 开始播放歌曲 [mediaPlayer open:filePath config:config]; // 设置歌曲进度回调,100ms 间隔回调一次 [mediaPlayer setProgressInterval:100]; } /** * 收到本地歌曲播放进度回调 * @param engine ByteRTCVideo 对象 * @param mixId 混音ID * @param progress 歌曲播放进度,单位为毫秒 */ - (void)rtcEngine:(ByteRTCVideo *)engine onAudioMixingPlayingProgress:(NSInteger)mixId progress:(int64_t)progress { // 如果是演唱者 BOOL isSinger; if (isSinger) { NSString *millisecondStr = [NSString stringWithFormat:@"%ld", (long)(progress)]; // 刷新本地歌词进度 [self reloadLocalLyrics:millisecondStr]; // 发送音频流同步信息 NSData *data = [millisecondStr dataUsingEncoding:NSUTF8StringEncoding]; ByteRTCStreamSycnInfoConfig *config = [[ByteRTCStreamSycnInfoConfig alloc] init]; config.streamIndex = ByteRTCStreamIndexMain; config.repeatCount = 3; [self.rtcEngineKit sendStreamSyncInfo:data config:config]; } } /** * 收到音频同步信息 * @param remoteStreamKey 远端流信息 * @param streamType 媒体流类型 * @param data 消息内容 */ - (void)rtcEngine:(ByteRTCVideo *)engine onStreamSyncInfoReceived:(ByteRTCRemoteStreamKey *)remoteStreamKey streamType:(ByteRTCSyncInfoStreamType)streamType data:(NSData *)data { NSString *millisecondStr = [[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding]; // 观众刷新歌词进度 [self reloadLocalLyrics:millisecondStr]; } /** * 音乐文件播放状态改变回调 */ -(void)onMediaPlayerStateChanged:(int)playerId state:(ByteRTCPlayerState)state error:(ByteRTCPlayerError)error { if (state == ByteRTCPlayerStateFinished) { // 歌曲播放结束 } }
/** * 原唱/伴奏切换,需要音乐素材支持右声道伴奏,左声道原唱 * @param isAccompaniment 是否为伴奏,YES 为伴奏,NO 为原唱 */ - (void)setIsAccompaniment:(BOOL)isAccompaniment { ByteRTCMediaPlayer *mediaPlayer = [self.rtcEngineKit getMediaPlayer:0]; if (isAccompaniment) { [mediaPlayer setAudioDualMonoMode:ByteRTCAudioMixingDualMonoModeR]; } else { [mediaPlayer setAudioDualMonoMode:ByteRTCAudioMixingDualMonoModeL]; } } /** * 原唱/伴奏切换,需要音乐素材支持。通过切换音轨来实现切换原唱/伴奏 * @param audioTrackIndex 指定的播放音轨。 * 设置的参数值需要小于或等于 getAudioTrackCount: 的返回值 */ - (void)setIsAccompaniment:(NSInteger)audioTrackIndex { ByteRTCMediaPlayer *mediaPlayer = [self.rtcEngineKit getMediaPlayer:0]; [mediaPlayer selectAudioTrack:audioTrackIndex]; } /** * 暂停混音播放 */ - (void)pauseSinging { ByteRTCMediaPlayer *mediaPlayer = [self.rtcEngineKit getMediaPlayer:0]; [mediaPlayer pause]; } /** * 恢复混音播放 */ - (void)resumeSinging { ByteRTCMediaPlayer *mediaPlayer = [self.rtcEngineKit getMediaPlayer:0]; [mediaPlayer resume]; } /** * 开启/关闭耳返 * @param isEnable YES 为开启耳返,NO 为关闭耳返 */ - (void)enableEarMonitor:(BOOL)isEnable { [self.rtcEngineKit setEarMonitorMode:isEnable ? ByteRTCEarMonitorModeOn : ByteRTCEarMonitorModeOff]; } /** * 设置耳返的音量 * @param volume 耳返音量 */ - (void)setEarMonitorVolume:(NSInteger)volume { [self.rtcEngineKit setEarMonitorVolume:volume]; } /** * 调节本地播放和远端混音的音量大小 * @param volume 混音音量 */ - (void)setMusicVolume:(NSInteger)volume { ByteRTCMediaPlayer *mediaPlayer = [self.rtcEngineKit getMediaPlayer:0]; [mediaPlayer setVolume:volume type:ByteRTCAudioMixingTypePlayoutAndPublish]; } /** * 调节麦克风采集音量 * @param volume 麦克风采集音量 */ - (void)setRecordingVolume:(NSInteger)volume { [self.rtcEngineKit setCaptureVolume:ByteRTCStreamIndexMain volume:(int)volume]; } /** * 设置混响特效类型 * @param reverbType 特效类型 */ - (void)setVoiceReverbType:(ByteRTCVoiceReverbType)reverbType { [self.rtcEngineKit setVoiceReverbType:reverbType]; }
功能点 | API |
---|---|
创建 ByteRTCVideo 实例 | createRTCVideo:delegate:parameters: |
创建 ByteRTCRoom 实例 | createRTCRoom: |
设置音频场景类型 | setAudioScenario: |
设置用户可见性 | setUserVisibility: |
开启内部音频采集 | startAudioCapture |
关闭内部音频采集 | stopAudioCapture |
设置当前音频播放路由 | setDefaultAudioRoute: |
设置音质档位 | setAudioProfile: |
开启音量信息提示 | enableAudioPropertiesReport: |
加入 RTC 房间 | joinRoom:userInfo:roomConfig: |
离开 RTC 房间 | leaveRoom |
销毁房间对象 | destroy |
在当前所在房间内发布本地通过摄像头/麦克风采集的媒体流 | publishStream |
停止将本地摄像头/麦克风采集的媒体流发布到当前所在房间中 | unpublishStream |
开启混音播放 | open:config: |
关闭混音播放 | stop |
暂停混音播放 | pause |
恢复混音播放 | resume |
设置混音时音频文件播放进度回调的间隔 | setProgressInterval: |
设置当前音频文件的声道模式 | setAudioDualMonoMode: |
发送音频流同步信息 | sendStreamSyncInfo:config: |
设置混响特效类型 | setVoiceReverbType: |
开启/关闭耳返功能 | setEarMonitorMode: |
设置耳返的音量 | setEarMonitorVolume: |
调节音频采集音量 | setCaptureVolume:volume: |
调节混音的音量大小 | setVolume:volume: |
功能点 | 回调 |
---|---|
本地用户加入 RTC 回调 | rtcRoom:onRoomStateChanged:uid:state:extraInfo |
远端用户加入 RTC 回调 | onUserJoined |
本地用户音量回调 | onLocalAudioPropertiesReport |
远端用户音量回调 | rtcEngine:onRemoteAudioPropertiesReport:totalRemoteVolume: |
收到音频同步信息 | rtcEngine:onStreamSyncInfoReceived:streamType:data: |
音乐文件播放状态改变回调 | onMediaPlayerStateChanged:state:error: |
收到音乐文件播放进度回调 | onMediaPlayerPlayingProgress:progress: |