如何輕鬆實現線上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” 中加入如下程式碼。
plain
...
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.+
修改為指定的版本號。
plain
...
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。
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” 檔案,新增許可權。
```java
因為 Android 6.0 在一些比較重要的許可權上要求必須申請動態許可權,不能只通過 “AndroidMainfest.xml” 檔案申請靜態許可權。因此還需要參考執行如下程式碼,其中 “requestPermissions” 是 “Activity” 的方法。
```java 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 公共類名稱。
plain
1
-keep class **.zego.**{*;}
與王心凌合唱線上K歌房實現了!!!
恭喜,王心凌線上K歌房實時合唱功能已完成,可下載甜心教主的熱門歌曲:《愛你》《睫毛彎彎》,或者翻唱的《山海》。實現追星自由,也可與好友一起多人實時合唱暢享線上K歌體驗。
獲取更多文件、Demo、技術幫助
- 獲取 SDK 開發文件、demo,可訪問即構文件中心。
- 獲取更多商務活動熱門產品,可提交資訊聯絡商務。
- 註冊即構ZEGO開發者帳號,快速開始。