如果能開發一個線上K歌應用,就能與王心凌線上合唱實現追星自由。 如何快速實現合唱功能?即構科技提供了實時合唱一站式解決方案和技術實現流程。 ...
王心凌與譚維維合唱《山海》
“他明白,他明白,我給不起,於是轉身向山裡走去。”
《浪姐3》二公舞臺王心凌和譚維維合唱的《山海》燃炸全場,引得屏幕前的粉絲也跟著王心凌一起飆高音。
如果能開發一個線上K歌應用,就能與王心凌線上合唱實現追星自由。
如何快速實現合唱功能?即構科技提供了實時合唱一站式解決方案和技術實現流程。
目前行業內普遍採用的合唱方案為“串列合唱”。在“串列合唱”方案中,合唱各方串列加入,伴奏由主唱端混入。從本質上來說,這是一種“偽實時合唱”。
·主唱體驗缺失:副唱、聽眾合唱同步效果良好,但主唱無法實時聽到副唱的歌聲
·合唱人數有限制:三人或以上的合唱實現複雜,延遲高,難以真正落地
為了突破這兩個限制,同時不影響副唱和聽眾端的體驗,即構對方案架構進行了重構,剋服了多個技術挑戰,實現了合唱者之間的實時互動,也滿足了三人及以上的合唱需求。
本文將分享如何基於ZEGO SDK輕鬆實現線上K歌房,適合想極速搭建線上 K 歌房的開發者。也適合想清晰聽到王心凌歌聲的男粉們。近期即構七周年慶全線產品1折起,有需要的開發者可點擊詳情瞭解:https://www.zego.im/activity/2100005
線上K歌技術方案
通過 ZEGO Express SDK,可極速搭建含 正版曲庫 的線上 KTV 場景:
線上K歌場景下實時合唱方案
針對實時合唱的場景,ZEGO 提供了一站式解決方案,讓開發者極速搭建能夠真正進行“合唱”的線上 K 歌房。
各端在連麥的基礎上同時播放歌曲伴奏,然後上麥進行合唱,雙人模式下主唱和副唱可以互相聽到對方聲音,多人模式下合唱者之間都能聽到彼此聲音,幾乎感受不到延遲,達到了真正意義上的實時合唱。
在媒體流方面,合唱者互相進行推拉流,同時會由一名合唱者推出歌曲伴奏,其他合唱者在本地播放伴奏,經過 NTP 進行時間同步。另外,歌曲伴奏和所有合唱者的聲音都通過 ZEGO RTC 進行混流服務處理形成一條流,觀眾只需拉一條流即可聽到各端同步的聲音,完美實現多人合唱的效果。
該方案的優點在於:
- 降低了端到端的時延。
- 提供了用戶中途加入合唱的解決方案。
- 精準同步不同端之間的伴奏、歌詞、人聲。
- 改善各端設備性能和本地時間不精準的情況,降低網路環境造成的時延影響。
實時合唱方案技術實現流程
1 概述
搭建一個完整的線上 KTV 需要實時語音(RTC)、點歌(歌曲的獲取與分享)、歌詞展示等基礎能力,並通過以上基礎能力實現合唱、麥位管理、房間管理、歌詞展示與同步等業務系統。
2 基本流程介紹
以下介紹實現一個完整線上 KTV 的基本流程,可幫助您從整體上理解線上 KTV 的核心業務。
2.1 基礎業務模塊
線上 KTV 整體方案包含房間管理、麥位管理、點歌系統、合唱同步管理、歌詞同步管理 5 個業務模塊,基本業務流程如下:
線上 K 歌房內的用戶有多種角色,包括房主、合唱者、觀眾。
角色 | 描述 |
---|---|
房主 | 創建 KTV 房間並推送人聲、伴奏到遠端,併發起混流任務。房主會自動上麥並固定為麥上首位。 |
合唱者 | 合唱者可以點歌,或者與其他合唱者進行合唱。 |
觀眾 | 進入 KTV 房間後,拉取播放房間內的混流。 |
不同角色在本方案中的基本實現流程如下:
房主
- 房主創建並加入房間。
- 發起混流任務(包括房主的人聲流、房主伴奏流以及所有合唱者的人聲流)。
- 通過發送 SEI 信息同步房間內所有人的歌曲播放進度。
- 房主退出房間,房間內所有成員自動退房。
房主創建及離開 RTC 房間,均需由業務伺服器創建房間獲取對應的 roomID 和 userID 後,然後通過調用 Express 介面 loginRoom 登錄房間和 logoutRoom 介面退出房間。
房主通過調用 Express 相關介面進行點歌、下載歌曲和歌詞、播放歌曲和發送 SEI 信息等操作,中間則由業務伺服器監聽房間內歌曲、麥位的信息變更,並通知房間內所有成員。歌詞下載完畢後,通過歌詞 UI 組件進行逐行或者逐字歌詞的展示。
合唱者
- 觀眾獲取房間列表並加入房間後,上麥成為合唱者。
- 推送自己的人聲流,拉取所有合唱者的人聲流,但不拉取混流。
- 接收並解析房主發送的 SEI 信息,校準本端播放器進度和歌詞。
觀眾加入 RTC 房間上麥成為合唱者,通過獲取由業務伺服器創建房間對應的 roomID 和 userID 後,然後通過調用 Express 介面 loginRoom 登錄房間。
合唱者通過調用 Express 相關介面下載歌曲和歌詞、播放歌曲、接收和解析房主發送的 SEI 信息、同步伴奏/歌詞等操作,中間則由業務伺服器監聽房間內歌曲、麥位的信息變更,並通知房間內所有成員。歌詞下載完畢後,通過歌詞 UI 組件進行逐行或者逐字歌詞的展示。
觀眾
- 觀眾獲取房間列表並加入房間。
- 監聽房間歌曲變化,並載入歌詞。
- 拉取房主發送的混流。
- 解析房主發送的 SEI 信息同步歌詞。
觀眾加入 RTC 房間,通過獲取由業務伺服器創建房間對應的 roomID 和 userID 後,然後通過調用 Express 介面 loginRoom 登錄房間。
觀眾通過調用 Express 相關介面下載歌詞、拉取混流、接收和解析房主發送的 SEI 信息等操作,中間則由業務伺服器監聽房間內歌曲、麥位的信息變更,並通知房間內所有成員。歌詞下載完畢後,通過歌詞 UI 組件進行逐行或者逐字歌詞的展示。
3.2 重要業務模塊
以下對房間管理、點歌(獲取與分享歌曲)、合唱、歌詞展示四個重要模塊進行簡單介紹。
房間管理
線上 KTV 中,一般不同的用戶會在一個房間內進行 K 歌,並且還提供了一個當前的房間列表,這兩部分共同構成了我們的房間管理系統,我們需搭配業務伺服器和 Express SDK 來實現這個功能。
房主需在業務伺服器創建房間獲取對應的 roomID 和 userID 後,再創建 RTC 房間,然後通過調用 Express 介面 loginRoom 登錄房間和 logoutRoom 介面退出房間。
API 調用時序可參考下圖:
點歌(獲取與分享歌曲)
點歌系統是線上 KTV 中關鍵部分,使用 Express SDK 提供的點歌能力,通過獲取正版曲庫中的音樂資源,並分享給房間內的其他用戶進行合唱。詳情請參考 點歌(獲取和分享歌曲)。
點歌操作可以在榜單列表或者歌曲搜索結果進行。所點的歌曲將會進入已點隊列,按照點歌時間逐首依次播放。
點歌人使用 songID 請求歌曲資源會觸發一次計費,房間內其餘人使用 token 請求歌曲資源則不會觸發計費。
API 調用時序可參考下圖:
合唱
線上 KTV 房間中的用戶在合唱的過程中,人聲和伴奏都要保持多端同步。
- 對於合唱者而言,歌曲的各端同步主要通過 SEI 消息實現。SEI 攜帶當前播放歌曲的 songID 以及歌曲播放進度 progress等,用於多端同步播放的信息。SEI 的發送時間間隔可以與播放器進度回調的時間間隔保持一致。
- 對於觀眾而言,歌曲和人聲的同步通過Express SDK 提供的精準混流功能實現。
流管理是多人實時合唱中非常重要的一部分。房主、合唱者、觀眾的推拉流策略需要互相配合以達到較好的合唱效果。
通過 Express SDK 的精準網路時間獲取介面,以及麥上其他合唱者約定合唱的精確時間,來進行播放伴奏和合唱,達到各合唱者之間的高度同步。詳情請參考 合唱同步實現流程。
API 調用時序可參考下圖:
合唱
- 流管理
歌詞展示
我們提供了開箱即用的歌詞 UI 組件,開發者可與 Express SDK(含版權音樂功能)搭配使用,快速展示歌詞效果。詳情可參考 歌詞展示與同步。
集成ZEGO SDK
1 準備環境
在開始集成 ZEGO Express SDK 前,請確保開發環境滿足以下要求:
-
Android Studio 2020.3.1 或以上版本。
Android Studio 版本編號系統的變更請參考 Android Studio 版本說明。 -
Android SDK 25、Android SDK Build-Tools 25.0.2、Android SDK Platform-Tools 25.x.x 或以上版本。
-
Android 4.4 或以上版本,且支持音視頻的 Android 設備。
-
Android 設備已經連接到 Internet。
2 項目準備
2.1 創建項目
進入即構官網,在【ZEGO控制台】創建項目,並申請有效的 AppID,這一步很關鍵,appid為應用的唯一標識,如身份證號,是應用的身份證明,用於明確你的項目及組織身份。zego提供的服務也是基於APP ID;
App ID的獲取方式很簡單,只需3~5分鐘,在即構官網-我的項目-創建即可。創建的項目信息可用於SDK的集成和配置;
2.2 Token 鑒權
- 登錄房間時必須 使用 Token 鑒權 ,可參考 Token 鑒權教程
- 為了方便開發階段的調試,開發者可直接在 ZEGO 控制台獲取臨時 Token(有效期為 24 小時) 來使用,詳情請參考 控制台(新版) - 項目管理 中的 “項目信息”。
3 集成 SDK
3.1 項目設置
開始集成前,可參考如下步驟設置你的項目;
如已有項目,本步驟可忽略。
如需新建項目,可按照以下步驟創建你的新項目:
1.打開 Android Studio,選擇 “File > New > New Project” 菜單。
2.填寫項目名及項目存儲路徑。
3.其它按照預設設置,單擊 “Next”,最後單擊 “Finish” 完成新工程創建。
3.2 導入 SDK
目前支持的平臺架構包括:armeabi-v7a、arm64-v8a、x86、x86_64。
在實現基本的實時音視頻功能之前,需確保獲取的sdk為最新版本,保證音視頻功能體驗為最優;
- 使用 JitPack 自動集成 SDK
進入項目根目錄,打開 “build.gradle” 文件,在 “allprojects” 中加入如下代碼。
...
allprojects {
repositories {
maven { url 'https://www.jitpack.io' }
google()
jcenter()
}
}
進入 “app” 目錄,打開 “build.gradle” 文件,在 “dependencies” 中添加 implementation 'com.github.zegolibrary:express-video:2.+'
,這樣能獲取到最新的版本,如果需要下載指定版本,請從 https://jitpack.io/#zegolibrary/express-video 查詢具體版本號,並將 2.+
修改為指定的版本號。
...
dependencies {
...
implementation 'com.github.zegolibrary:express-video:2.+'
}
1. 從 **2.7.0** 版本開始,Zego 將使用 JitPack 代替 JCenter 作為 SDK 托管伺服器,因此開發者需手動將 `build.gradle` 里的配置變更為 `'com.github.zegolibrary:express-video:2.+'`
2. JCenter **2021-03-31** 之後停止上傳新版本 SDK,該服務將於 **2021-05-01 停用**,詳情請參考 [Service End for JCenter](https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/)。
3. 從 **1.11.0** 版本開始,依賴的命令從 `implementation 'im.zego:express-engine-video:x.y.z'` 改為 `implementation 'im.zego:express-video:x.y.z'`。使用 **1.11.0 以下** 的版本不受影響,但後續不再從 “express-engine-video” 里更新,建議所有使用舊版本的開發者切換到 **1.11.0 或以上** 的版本進行集成。
4 設置許可權
以上步驟集成已完成,為保證SDK運行效果更佳,需要在應用中設置所需的許可權,步驟如下:
進入 “app/src/main” 目錄,打開 “AndroidManifest.xml” 文件,添加許可權。
<!-- SDK 必須使用的許可權 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- App 需要使用的部分許可權 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
因為 Android 6.0 在一些比較重要的許可權上要求必須申請動態許可權,不能只通過 “AndroidMainfest.xml” 文件申請靜態許可權。因此還需要參考執行如下代碼,其中 “requestPermissions” 是 “Activity” 的方法。
String[] permissionNeeded = {
"android.permission.CAMERA",
"android.permission.RECORD_AUDIO"};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, "android.permission.CAMERA") != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, "android.permission.RECORD_AUDIO") != PackageManager.PERMISSION_GRANTED) {
requestPermissions(permissionNeeded, 101);
}
}
具體的許可權說明如下:
必要性 | 許可權 | 許可權說明 | 申請原因 |
---|---|---|---|
必要許可權 | INTERNET | 訪問網路許可權。 | SDK 基本功能都需要在聯網的情況下才可以使用。 |
ACCESS_WIFI_STATE | 獲取當前 WiFi 狀態許可權。 | SDK 會根據網路狀態的改變執行不同的操作。例如當網路重連的時候,SDK 內部會將網路斷開時的狀態都恢復,用戶不需做額外的操作。 | |
ACCESS_NETWORK_STATE | 獲取當前網路狀態許可權。 | ||
CAMERA | 訪問相機許可權。 | 預覽和發送視頻的時候需要使用該許可權。 | |
RECORD_AUDIO | 錄製音頻許可權。 | 發送音頻的時候需要使用該許可權。 | |
BLUETOOTH | 連接藍牙設備許可權。 | 連接藍牙設備時需要使用該許可權。 | |
MODIFY_AUDIO_SETTINGS | 修改音頻配置許可權。 | 修改音頻設備配置時需要使用該許可權。 | |
WRITE_EXTERNAL_STORAGE | 內置 SDK 寫許可權。 | SDK 會將日誌和相關配置文件保存在內置 SDK 內。 | |
非必要許可權 | READ_PHONE_STATE | 允許以只讀方式訪問電話狀態,包括當前的呼叫狀態。 | SDK 會根據當前的呼叫狀態,啟停音頻設備。如監聽到當前為呼叫狀態,則 SDK 會自動停止使用音頻設備,直到通話結束。 |
其中非必要許可權 “android.permission.READ_PHONE_STATE” 僅用於實現 SDK 的打斷事件處理,因此只需在 AndroidMainfest.xml 文件中進行聲明即可,不需要動態申請(業務方有需求則另外處理)。
5 防止混淆代碼
在 “proguard-rules.pro” 文件中,為 SDK 添加 -keep
類的配置,防止混淆 SDK 公共類名稱。
1
-keep class **.zego.**{*;}
與王心凌合唱線上K歌房實現了!!!
恭喜,王心凌線上K歌房實時合唱功能已完成,可下載甜心教主的熱門歌曲:《愛你》《睫毛彎彎》,或者翻唱的《山海》。實現追星自由,也可與好友一起多人實時合唱暢享線上K歌體驗。
獲取更多文檔、Demo、技術幫助
- 獲取 SDK 開發文檔、demo,可訪問即構文檔中心。
- 獲取更多商務活動熱門產品,可提交信息聯繫商務。
- 註冊即構ZEGO開發者帳號,快速開始。