2024/08/27 13:21:22
抢唱
本文介绍如何实现歌曲副歌片段抢唱。在此之前,请确保你已参考实现文档集成 KTV API。
方案介绍
默认由房主播放副歌片段(播放的实现逻辑同独唱),听众可以上麦进行抢唱,抢到麦后房主停止播放,抢到麦的人播放副歌片段并进行独唱,K 歌房内的听众都可以听到其演唱。
抢唱场景下存在两种角色:
- 独唱者:加入频道,加载并播放歌曲。KTV API 模块内部控制音乐播放器播放音乐,发布音乐到远端,将音乐播放进度同步到远端,让歌词组件进入歌词滚动状态等逻辑。
- 听众:加入频道,加载歌词。KTV API 模块内部控制听众订阅独唱者的人声和音乐的音频合流,同步独唱者的音乐播放进度,让歌词组件进入歌词滚动状态等逻辑。如果听众需要上麦聊天,可以更新媒体选项。
下图为抢唱方案的技术原理图:
抢唱实现
与独唱方案相比,抢唱方案中仅需在 KTVApiConfig
中将 KTVType
设为 SingBattle
(抢唱场景),独唱者实现和听众实现基本仅在加载及播放有差异。因此,你可以参考独唱方案来实现独唱者和听众逻辑。
加载及播放
在播放副歌片段之前,你需要先调用 getInternalSongCode
方法为该片段创建一个编号,作为该片段的唯一标识。当你获取到该片段的编号后,调用 loadMusic
并将获取到的副歌片段编号传入 songCode
参数来加载该副歌片段。
获取副歌片段总分
抢唱场景下播放和演唱的音乐资源为副歌片段,你可以参考下列步骤来获取副歌片段的总分:
-
通过
onHighPartTime
回调获取副歌片段开始和结束时间。 -
调用歌词组件中的
parseLyricsData
方法解析歌词文件数据,获取歌词数据模型。 -
通过歌词的行数来计算副歌片段的总分,示例代码如下:
Kotlin// 变量,用于保存副歌片段的总分
int totalScore = 0;
// 计数器,用于统计处于副歌片段开始和结束时间之间的歌词行数
AtomicInteger lineCount = new AtomicInteger();
// 遍历歌词数据模型中的每一行歌词,检查每行歌词是否处于副歌片段开始和结束时间的范围内
lyricsModel.lines.forEach(line -> {
if (line.getStartTime() >= highStartTime && line.getEndTime() <= highEndTime) {
// 计算出处于开始和结束时间之间的歌词行数
lineCount.getAndIncrement();
}
});
// 总分=行数*100
totalScore = lineCount.get() * 100;
API 参考
本文集成步骤中使用如下 API: