如何輕鬆實現線上K歌房,與王心凌合唱《山海》

来源:https://www.cnblogs.com/zegodeveloper/archive/2022/06/24/16408472.html
-Advertisement-
Play Games

如果能開發一個線上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 房間後,拉取播放房間內的混流。

不同角色在本方案中的基本實現流程如下:

房主

  1. 房主創建並加入房間。
  2. 發起混流任務(包括房主的人聲流、房主伴奏流以及所有合唱者的人聲流)。
  3. 通過發送 SEI 信息同步房間內所有人的歌曲播放進度。
  4. 房主退出房間,房間內所有成員自動退房。
    房主創建及離開 RTC 房間,均需由業務伺服器創建房間獲取對應的 roomID 和 userID 後,然後通過調用 Express 介面 loginRoom 登錄房間和 logoutRoom 介面退出房間。

房主通過調用 Express 相關介面進行點歌、下載歌曲和歌詞、播放歌曲和發送 SEI 信息等操作,中間則由業務伺服器監聽房間內歌曲、麥位的信息變更,並通知房間內所有成員。歌詞下載完畢後,通過歌詞 UI 組件進行逐行或者逐字歌詞的展示。

合唱者

  1. 觀眾獲取房間列表並加入房間後,上麥成為合唱者。
  2. 推送自己的人聲流,拉取所有合唱者的人聲流,但不拉取混流。
  3. 接收並解析房主發送的 SEI 信息,校準本端播放器進度和歌詞。
    觀眾加入 RTC 房間上麥成為合唱者,通過獲取由業務伺服器創建房間對應的 roomID 和 userID 後,然後通過調用 Express 介面 loginRoom 登錄房間。

合唱者通過調用 Express 相關介面下載歌曲和歌詞、播放歌曲、接收和解析房主發送的 SEI 信息、同步伴奏/歌詞等操作,中間則由業務伺服器監聽房間內歌曲、麥位的信息變更,並通知房間內所有成員。歌詞下載完畢後,通過歌詞 UI 組件進行逐行或者逐字歌詞的展示。

觀眾

  1. 觀眾獲取房間列表並加入房間。
  2. 監聽房間歌曲變化,並載入歌詞。
  3. 拉取房主發送的混流。
  4. 解析房主發送的 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、技術幫助

音視頻場景解決方案分享,更多詳情可搜索官網(https://zegoguanwang.datasink.sensorsdata.cn/t/pB)
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 Maven集成 在Jenkins上發佈Java項目時需要使用Maven來進行構建打包(Gradle項目則需要安裝配置Gradle) 1.1 環境準備 這篇文章是在前一篇文章的基礎上 maven包下載地址 [root@192 java]# pwd ...
  • 記錄如何通過 valgrind 的 memcheck 工具分析定位記憶體泄漏的問題 ...
  • #RDD(2) ##RDD轉換運算元 RDD根據數據處理方式的不同將運算元整體上分為Value類型、雙Value類型、Key-Value類型 ###value類型 ####map 函數簽名 def map[U:ClassTag](f:T=>U):RDD[U] 函數說明 將處理的數據逐條進行映射轉換,這裡 ...
  • 更多技術交流、求職機會、試用福利,歡迎關註位元組跳動數據平臺微信公眾號,回覆【1】進入官方交流群 ClickHouse 作為目前業內主流的列式存儲資料庫(DBMS)之一,擁有著同類型 DBMS 難以企及的查詢速度。作為該領域中的後起之秀,ClickHouse 已憑藉其性能優勢引領了業內新一輪分析型數據 ...
  • 6月29日,騰訊雲資料庫聯合CSDN舉辦的“數啟揚帆,智聚人才”峰會順利舉行。本次會議重磅發佈了騰訊雲聯合CSDN推出的資料庫工程師能力認證——騰訊雲資料庫微認證,旨在助力資料庫人才體系建設,造福產業發展,打通在校和在職的能力銜接,強化人才全生命周期的培養方案和技能提升,優秀者還可獲得騰訊雲面試直通 ...
  • Spark計算框架為適應高併發和高吞吐的數據處理需求,封裝了三大數據結構,以處理不同應用: 1)RDD:彈性分散式數據集 2)累加器:分散式共用只寫變數 3)廣播變數:分散式共用只讀變數 ##RDD(1) ###什麼是RDD RDD(Resilient Distributed Dataset)彈性分 ...
  • 這是一個使用Java(以後還會推出Kotlin版本)語言,從0開發一個Android平臺,接近企業級的項目(我的雲音樂),包含了基礎內容,高級內容,項目封裝,項目重構等知識;主要是使用系統功能,流行的第三方框架,第三方服務,完成接近企業級商業級項目。 ...
  • 6月30日,在2022(第五屆)GIS軟體技術大會GIS基礎軟體新技術板塊論壇上,華為聯合超圖推出了基於HMS Core 3D Engine開發的高保真三維GIS插件,通過3D渲染技術助力三維GIS實現更高清、更具真實感的數字世界場景。 本次大會以“地理智慧 多維築基”為主題,旨在分享GIS軟體的最 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...