Android

最近更新时间:2022-10-31 16:18:13

我的收藏

具体代码实现

1. 创建主子实例

// 创建 TRTCCloud 主实例(人声实例)
TRTCCloud mTRTCCloud = TRTCCloud.sharedInstance(getApplicationContext());
// 创建 TRTCCloud 子实例(伴奏实例)
TRTCCloud subCloud = mTRTCCloud.createSubCloud();
说明:
实时合唱方案中,主唱端需要分别创建主实例-人声实例和子实例-伴奏实例,分别用于上行人声及伴奏音乐。

2. 人声实例进房推流

TRTCCloudDef.TRTCParams params = new TRTCCloudDef.TRTCParams();
params.sdkAppId = sdkAppId;
params.userId = mUserId;
params.userSig = userSig;
params.role = TRTCCloudDef.TRTCRoleAnchor;
params.roomId = mRoomId;
mTRTCCloud.enterRoom(params, TRTCCloudDef.TRTC_APP_SCENE_LIVE);
// 打开音频上行,设置音质
mTRTCCloud.startLocalAudio(TRTCCloudDef.TRTC_AUDIO_QUALITY_MUSIC);
// 设置媒体类型
mTRTCCloud.setSystemVolumeType(TRTCCloudDef.TRTCSystemVolumeTypeMedia);
// 静音远端伴奏音乐
mTRTCCloud.muteRemoteAudio(mUserId + "_bgm", true);
注意:
纯 RTC 音频场景下,进房场景推荐选用 VOICE_CHATROOM。
若有视频或转推 CDN 需求,进房场景则须选用 LIVE,VOICE_CHATROOM 会在转推时添加纯音频参数,从而导致 SEI 消息无法透传。
主唱/合唱端需要 muteRemoteAudio(true) 取消订阅伴奏实例上行的音频流,否则会重复播放本地及远端的伴奏音乐。

3. 伴奏实例进房推流

TRTCCloudDef.TRTCParams bgmParams = new TRTCCloudDef.TRTCParams();
bgmParams.sdkAppId = sdkAppId;
bgmParams.userId = mUserId + "_bgm";
bgmParams.userSig = userSig;
bgmParams.role = TRTCCloudDef.TRTCRoleAnchor;
bgmParams.roomId = mRoomId;
subCloud.enterRoom(bgmParams, TRTCCloudDef.TRTC_APP_SCENE_LIVE);
//设置媒体类型
subCloud.setSystemVolumeType(TRTCCloudDef.TRTCSystemVolumeTypeMedia);

// 开启预加载
subCloud.callExperimentalAPI("{\\"api\\":\\"preloadMusic\\",\\"params\\": {\\"musicId\\":musicId,\\"path\\":\\"path\\",\\"startTimeMS\\":startTimeMS}}");
// 播放伴奏音乐并推流(在约定时间播放)
TXAudioEffectManager.AudioMusicParam param = new TXAudioEffectManager.AudioMusicParam(musicID, musicPath);
// 将伴奏音乐传到远端
param.publish = true;
subCloud.getAudioEffectManager().startPlayMusic(param);
注意:
注意区分主实例和子实例的 userId,确保不重复且容易辨别;
伴奏实例播放背景音乐参数 AudioMusicParam 设置:
publish:true(音乐在本地播放的同时,远端用户也能听到该音乐)
publish:false(默认值,只能在本地听到该音乐,远端用户听不到)

4. 发起混流转码回推

// 创建 TRTCPublishTarget 对象
TRTCCloudDef.TRTCPublishTarget target = new TRTCCloudDef.TRTCPublishTarget();
// 混流后回推到房间,若发布到 CDN 应填 TRTC_PublishMixStream_ToCdn
target.mode = TRTCCloudDef.TRTC_PublishMixStream_ToRoom;
target.mixStreamIdentity.intRoomId = Integer.parseInt(mRoomId);
// 混流机器人的 userid,不能和房间内其他用户的 userid 重复
target.mixStreamIdentity.userId = mUserId + "_mix";
// 设置转码后的音频流的编码参数
TRTCCloudDef.TRTCStreamEncoderParam trtcStreamEncoderParam = new TRTCCloudDef.TRTCStreamEncoderParam();
trtcStreamEncoderParam.audioEncodedChannelNum = 2;
trtcStreamEncoderParam.audioEncodedKbps = 64;
trtcStreamEncoderParam.audioEncodedCodecType = 2;
trtcStreamEncoderParam.audioEncodedSampleRate = 48000;

// 设置音频混流参数
TRTCCloudDef.TRTCStreamMixingConfig trtcStreamMixingConfig = new TRTCCloudDef.TRTCStreamMixingConfig();
// 支持填写空值,会自动将所有主播的音频混合输出
trtcStreamMixingConfig.audioMixUserList = null;

// 发起混流转推请求
mTRTCCloud.startPublishMediaStream(target, trtcStreamEncoderParam, trtcStreamMixingConfig);
注意:
优先选择主唱通过混流机器人向后台发起混流转推,将伴奏音乐和各路人声混合后回推至 TRTC 房间,或转推至直播 CDN。
自动订阅模式下,参与混流转码的主播默认互相拉取单流,不接收回推房间的混流;观众自动拉取回推房间的混流,不再接收单流。
这里的混流转推方法 startPublishMediaStream 采用全新的后台架构,旧版应用需提供 SdkAppId 申请升级后方可使用。