写点什么

技术教程 | 在线 KTV 实现过程(内附 demo 体验)

作者:ZEGO即构
  • 2021 年 12 月 17 日
  • 本文字数:3730 字

    阅读完需:约 12 分钟

技术教程 | 在线 KTV 实现过程(内附demo体验)

你在线上 K 过歌吗?


在线 K 歌自 2014 年兴起以来,已经发展出了无比庞大的用户群体,每两人中就有就有一人体验过在线 K 歌,其前景不可小觑。


如此庞大的市场规模,以及音视频技术使用门槛逐步降低的加持,各类在线 K 歌玩家大幅增加,在 K 歌赛道大放异彩,对于开发者而言,如何能够快速实现线上 KTV 的场景就变得十分重要。


想要快速实现一起在线 K 歌的开发,看起来很难,那是因为你还不知道 ZEGO 即构科技,只要实现以下三步就可以快速的实现一起 K 歌的开发。



今天的文章就带领大家一起了解线上 KTV 的结构与实现过程,让开发变得更简单!

一、准备工作

1、开发环境的准备

更多详情可点击:集成过程


  • Android Studio 2.1 或以上版本。

  • Android SDK 25、Android SDK Build-Tools 25.0.2、Android SDK Platform-Tools 25.x.x 或以上版本。

  • Android 4.1 或以上版本,且支持音视频的 Android 设备。

  • Android 设备已经连接到 Internet。

2、ZEGO 平台账号的注册

开发环境搭建好之后,需要在 ZEGO 管理控制台上创建应用、才能获取开发需要的 AppId 和 AppSign 。具体的创建应用过程详见文章:控制台创建项目流程

二、实现流程详细介绍

1、接口规范说明

首先分析 ZEGO 的 API 输入输出规范。根据 API使用文档 来看,调用接口格式如下:



以创建 ZegoExpressEngine 单列对象为列,每个参数都详细的解析其作用。每个接口都描述了作用与用法。

2、一起 KTV 的项目开发 (实现流程

一起 KTV 是一个依附于语音聊天室的娱乐场景。在这个场景中,一个 KTV 房间里包含了三种角色(房主、合唱着、听众)。


房主:创建 KTV 房间并推送人声、伴奏到远端,并发起混流任务。房主会自动上麦并固定为麦上首位。可点歌切歌(包括自己点的歌和合唱者点的歌)


合唱者:合唱者可以点歌,或者与其他合唱者进行合唱。(上麦后成为合唱者,可点歌切歌-只能切当前播放是自己点的歌)


听众:进入 KTV 房间后,拉取播放房间内的混流。


其中的功能模块有,房间管理、麦位管理、点歌系统、合唱同步管理、歌词同步管理 5 个业务模块。


整体架构图如下: 



整体实现流程如下:接入参考链接


(1)用户需要调用 createEngine 接口,初始化 ZEGO Express SDK。


/** 定义 SDK 引擎对象 */ ZegoExpressEngine engine;  ZegoEngineProfile profile = new ZegoEngineProfile(); /** 请通过官网注册获取,格式为 123456789L */ profile.appID = appID; /** 64个字符,请通过官网注册获取,格式为"0123456789" */ profile.appSign = appSign; /** 通用场景接入 */ profile.scenario = ZegoScenario.GENERAL; /** 设置app的application 对象 */  profile.application = getApplication();  /** 创建引擎 */  engine = ZegoExpressEngine.createEngine(profile, null);
复制代码


(2)用户需要调用 createCopyrightedMusic 接口,创建版权音乐对象。


/** 定义 CopyrightedMusic 对象 */ ZegoCopyrightedMusic copyrightedMusic; /** 创建 CopyrightedMusic 对象 */ copyrightedMusic = engine.createCopyrightedMusic();
复制代码


(3)用户需要调用 initCopyrightedMusic 接口,初始化版权音乐对象。


/** initCopyrightedMusic *//** CopyrightedMusicConfig */ ZegoCopyrightedMusicConfig config = new ZegoCopyrightedMusicConfig(); /** 填写 userID、userName */ String userID = ; String userName = ; ZegoUser user = new ZegoUser(userID, userName); config.user = user;  copyrightedMusic.initCopyrightedMusic(config, new IZegoCopyrightedMusicInitCallback() {     @Override      public void onInitCallback(int i) {        }  });
复制代码


(4)用户可以通过调用 sendExtendedRequest 接口,发送版权音乐扩展请求,获取 songID(songID 是一首歌曲的唯一标识)。


// 下面以获取歌单列表为例 String command = "/playlist/classify"; // 扩展请求参数,json格式字符串  String params = "{    "category_id": "577",    "page": 1,    "size": 10}"; copyrightedMusic.sendExtendedRequest(command, params, new IZegoCopyrightedMusicSendExtendedRequestCallback() {     @Override     public void onSendExtendedRequestCallback(int i, String s, String s1) {     // s: command     // s1: result  json 格式字符串      } });
复制代码


(5)用户可以调用 requestSong、requestAccompaniment 接口,进行点歌或点伴奏,然后通过 ZegoCopyrightedMusicRequestSongCallback、ZegoCopyrightedMusicRequestAccompanimentCallback 回调接口,获取 songID 对应的 resourceID、shareToken。


/** 点歌配置 */ ZegoCopyrightedMusicRequestConfig config = new ZegoCopyrightedMusicRequestConfig(); /** 音乐 songID */ config.songID = ; /** 计费模式 */ config.mode = ZegoCopyrightedMusicBillingMode.getZegoCopyrightedMusicBillingMode(0);  /** 点伴奏 */ copyrightedMusic.requestAccompaniment(config, new IZegoCopyrightedMusicRequestAccompanimentCallback() {     @Override     public void onRequestAccompanimentCallback(int i, String s) {         // s: result     } });
复制代码


(6)在获取到其他用户分享的 shareToken 后,可以在有效时间内调用 getMusicByToken 接口获取被分享的音乐资源,然后通过 ZegoCopyrightedMusicGetMusicByTokenCallback 回调获取 shareToken 对应的 resourceID。


/** 输入 shareToken */ String shareToken = ;  copyrightedMusic.getMusicByToken(shareToken, new IZegoCopyrightedMusicGetMusicByTokenCallback() {     @Override     public void onGetMusicByTokenCallback(int i, String s) {              // s: result      } });
复制代码


(7) 用户可以调用 getLrcLyric 接口获取歌词,将会通过 ZegoCopyrightedMusicGetLrcLyricCallback 回调获取到结果。


/** 音乐 songID */ String songID = ;  copyrightedMusic.getLrcLyric(songID, new IZegoCopyrightedMusicGetLrcLyricCallback() {     @Override     public void onGetLrcLyricCallback(int errorCode,, String lyrics) {         // s: result     } });
复制代码


(8)用户获取 resourceID 后可以调用 download 接口下载资源。


/** resourceID */ String resourceID = ;  copyrightedMusic.download(resourceID, new IZegoCopyrightedMusicDownloadCallback() {      @Override      public void onDownloadCallback(int i) {      } });
复制代码


(9)下载资源成功后,用户可以开始调用 start 接口播放资源,或通过 pause 、stop 等接口调整播放状态。


/** 音乐资源 ID */ String resourceID = ;  // playlong startPosition = ;  // 创建 ZegoMediaPlayer mediaPlayer = engine.createMediaPlayer();  mediaPlayer.loadCopyrightedMusicResourceWithPosition(resourceID, startPosition); mediaPlayer.start();  // pause mediaPlayer.pause();  // resume mediaPlayer.resume();  // stop mediaPlayer.stop();  // seekTolong position = ; mediaPlayer.seekTo(position, new IZegoMediaPlayerSeekToCallback() {     @Override     public void onSeekToCallback(int i) {      }  });
复制代码

3、角色实现流程

(1)房主端的实现流程

  1. 创建引擎并配置。

  2. 通过业务后台创建房间,创建成功后调用 loginRoom 加入 RTC 房间。

  3. 房主默认上麦,并处于麦上首位。

  4. 房主可自由点歌、切歌(自己点的歌、合唱者点的歌)。

  5. 精准混流任务仅由房主发起,混流包括房主的人声流、房主伴奏流以及所有合唱者的人声流。

  6. 发送 SEI 信息,让房间内所有人同步歌曲播放进度。

  7. 房主可让其他上麦成员下麦,同时需要通知房间内所有成员麦位变化以更新麦位信息。

  8. 房主调用业务后台销毁房间,成功后调用 logoutRoom 销毁 RTC 房间,房间内所有成员自动退房。


流程图如下:


(2)合唱者端的实现流程

  1. 创建引擎并进行相关配置。

  2. 获取房间列表,加入业务后台房间,成功后调用 loginRoom 加入 RTC 房间。

  3. 进房后上麦成为合唱者。上麦过后可点歌、当前播放的是自己点的歌也可切歌。

  4. 监听房间歌曲变化,按需加载歌曲和歌词。

  5. 推送自己的人声流,拉取所有合唱者的人声流,但不拉取混流。

  6. 解析房主发送的 SEI 信息,当歌曲播放进度与房主的差距过大时,校准本端播放器进度和歌词。


流程图如下:


(3)听众端的实现流程

  1. 创建引擎并进行相关配置。

  2. 获取房间列表,加入业务后台房间,成功后调用 loginRoom 加入 RTC 房间。

  3. 监听房间歌曲变化,按需加载歌词。

  4. 拉取混流。

  5. 解析房主发送的 SEI 信息,校准本端歌词进度。


流程图如下:


三、在线 KTV 效果展示

想要体验 Demo 可点击链接下载:Android apk 安装包


四、总结

牛顿曾说:我看得远,是因为我站在巨人的肩膀上!


基于 ZEGO 即构科技的音视频功能、在线 K 歌的解决方案,一番操作下来,很简单就开发出来一款《一起 KTV》的 demo。而在线 KTV 的合唱体验能够取得突破,得益于即构科技在端到端通话延迟上的重大进展,即构通过对数据传输每个环节的优化,在保障的合唱体验效果的前提下,将端到端的感官延迟降低至 70ms,带来最极致的视听盛宴!


一起动手实操一下吧!



发布于: 4 小时前阅读数: 9
用户头像

ZEGO即构

关注

专注音视频领域19年 2020.04.15 加入

全球领先的音视频云服务商,已为映客、酷狗、喜马拉雅、荔枝、好未来、作业帮、掌门一对一、Live.Me、UpLive、Mico、平安科技等众多行业头部企业提供音视频云服务。

评论

发布
暂无评论
技术教程 | 在线 KTV 实现过程(内附demo体验)