如何輕鬆實現線上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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...