1 對 1 語音聊天
1 對 1 語音聊天是一款雙人實時通話産品(不具備視訊通話功能),擁有實時通話、設定背景音樂等功能。能夠為開發者提供高音質、低延遲、便捷接入、多平台互通的服務。可适用于私密聊、語音陪聊等社交場景。
Demo 體驗
AliRTC 為 1 對 1 語音聊天提供 Android 和 iOS 的 Demo,通過釘釘掃碼下載下傳。

主要功能
功能描述 | |
實時語音通話 | 超低延時下,使用者之間實作語音通話功能。 |
背景音樂 | 可以播放指定背景音樂。 |
伴奏混音 | 将本地或線上的音頻和使用者聲音,同時發送并播放給另一名使用者。 |
高音質 | 支援 48kHz 采樣的高音質,支援左右聲道。 |
3A 音頻處理 | 行業領先的音頻 3A(AGC、AEC、ANS),支援針對人聲、樂器等場景定制化調優。 |
實作方法
建立房間 API 時序圖(Android 端):
前提條件
源碼下載下傳
請單擊
Demo 下載下傳,下載下傳源碼。
實作流程
實作流程如下圖所示:
內建服務端
- 您已經完成注冊阿裡雲賬号,并完成實名認證,具體操作請參見
- 您已經開通音視訊通信服務,具體操作請參見 開通服務 。1 對 1 語音聊天無需購買套餐也可正常搭建。
- 首次開通 RTC 服務後,系統會自動幫您建立一個應用項目,可以直接使用自動建立好的應用項目進行使用。如果沒有應用項目,需要您在阿裡雲音視訊通信 RTC 控制台 建立應用
- 服務端環境需要 Java JDK 8 的版本,具體操作,請參見 安裝 JDK
說明 Linux 環境推薦安裝 Oracle JDK,不推薦使用 Open JDK 進行服務端內建。
操作步驟
說明 您在內建服務端時,如果遇到問題,請參見
服務端運作常見問題- 擷取應用 ID 和 AppKey。說明應用 ID 和 AppKey 需要對應,不同的應用 ID 有不同的 AppKey。在後續開發中會使用應用 ID 和 AppKey,建議記錄到本地文檔中,妥善儲存。
-
- 登入 RTC 控制台
- 在左側導航欄單擊應用管理,進入應用管理頁面。
- 擷取應用 ID 和查詢 AppKey。
-
-
- 應用 ID:可在應用 ID / 名稱清單下直接擷取。
- AppKey:單擊查詢 AppKey 擷取 AppKey。
-
-
- 如果您還未有應用,您可以單擊建立應用建立。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端
- 如果您還未有應用,您可以單擊建立應用建立。
- 擷取 AccessKey。警告由于主賬号 AccessKey 洩露會威脅您所有資源的安全,是以出于安全考慮,需要建立一個子賬号(RAM 使用者)并擷取子賬号的 AccessKey,用于 1 對 1 語音聊天 Demo 通路您的雲資源。
-
- RAM 控制台
- 在左側導航欄選擇人員管理 > 使用者,進入使用者頁面。
- 單擊建立使用者,填寫使用者賬号資訊,選中程式設計通路建立使用者。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - 單擊确定。
- 重新傳回使用者頁面。在使用者登入名稱 / 顯示名稱清單下,單擊目标 RAM 子賬戶,進入管理頁面。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - 單擊權限管理,單擊添權重限。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - 選擇 AliyunRTCFullAccess(管理音視訊通信(RTC)的權限),可輸入 RTC 進行搜尋。單擊确定。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - 單擊認證管理,在使用者 AccessKey 區域單擊建立 AccessKey。說明
-
-
- 首次建立時需填寫手機驗證碼。
- 如果 AccessKey 洩露或丢失,則需要建立新的 AccessKey,最多可以建立 2 個 AccessKey。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端
-
-
-
擷取 AccessKey ID 和 AccessKey Secret。建立 AccessKey 完成後,會彈出建立 AccessKey 對話框,可以擷取 AccessKey ID 和 AccessKey Secret。
注意 AccessKey ID 和 AccessKey Secret 在後續開發中會使用,建議記錄到本地文檔妥善儲存。AccessKey Secret 隻在建立時顯示,不提供查詢。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端
-
- 下載下傳 Demo 源碼。說明
-
- 源碼壓縮檔案内分為 Server 端、Android 端、iOS 端三個源檔案。
- 若遇到 Github 代碼庫下載下傳緩慢的問題,可通過安裝加速插件等方式加速下載下傳。
-
- 選擇 server/dist/rtc-api.zip 檔案,解壓到 dist 檔案夾下。
-
-
- Mac 環境下請将終端定位至 dist 目錄下,使用 unzip 指令解壓。
-
unzip rtc-api.zip
-
-
- Windows 環境下請直接輕按兩下解壓。
-
-
- 解壓成功後如圖所示。 說明 解壓成功後,可以看到 BOOT-INF、META-INF 及 org 檔案夾,這三個檔案夾需要和 restart.sh 保持在同一個目錄下。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - 修改配置檔案。打開 BOOT-INF/classes/application.properties檔案,修改配置。說明使用文本編輯器打開即可,若找不到打開方式,推薦安裝 VSCode 等輕量級代碼編輯器打開。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端
- 解壓成功後如圖所示。
-
-
- 設定 RTC 應用 AppId 和 AppKey,可參見步驟 擷取 AppKey 和應用 ID。
擷取。rtc.1v1audio.appId = *
rtc.1v1audio.appKey = *
- 設定 AK,需要添加 AliyunRTCFullAccess 權限,可參見步驟 擷取 AccessKey
擷取。accessKeyID=*
accessKeySecret=*
- 設定 RTC 應用 AppId 和 AppKey,可參見步驟 擷取 AppKey 和應用 ID。
-
- 運作服務,執行 restart.sh 檔案。
-
-
Mac 或 Linux 環境下請将終端定位至 dist 目錄下,執行如下指令:sh restart.sh
背景執行可以使用如下指令以確定退出終端時程式能夠繼續運作。
nohup sh restart.sh >./run_log.log 2>&1 &
-
Windows 環境需要打開 CMD 終端定位到 server/dist 檔案夾下,執行如下指令:java org.springframework.boot.loader.JarLauncher
若提示 8080 端口被占用,請嘗試使用 netstat 指令檢視占用 8080 端口的程序 pid 号,并使用 taskkill 關閉相關程序。
netstat -ano | findstr 8080
taskkill /pid 占用端口的程序 pid 号 /f
終端成功運作後可以看到服務端啟動成功的日志資訊。産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端
-
- 通路指定 URL 位址。URL 位址: http://127.0.0.1:8080/1v1-audio/index.html 如果您在浏覽器上看到 Hello RTC! ,代表服務端已經啟動。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端
主要功能說明
-
生成 joinChannel 所需鑒權資訊通路位址:/app/token
用戶端調用 RTC SDK 加入房間的 Token 資訊就是從這個接口獲得。具體生成方式,請參見 RTC 幫助文檔
生成 Token
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(appId.getBytes());
digest.update(appKey.getBytes());
digest.update(channelId.getBytes());
digest.update(userId.getBytes());
digest.update(nonce.getBytes());
digest.update(Long.toString(timestamp).getBytes());
String token = DatatypeConverter.printHexBinary(digest.digest()).toLowerCase();
return token;
-
查詢頻道實時線上使用者清單通路位址:/app/descChannelUsers
AppServer 通過調用 rtcOpenApi 的
DescribeChannelUsers 接口查詢頻道的實時線上人數。
DefaultAcsClient client = initVodClient();
DescribeChannelUsersRequest request = new DescribeChannelUsersRequest();
request.setAppId(appId);
request.setChannelId(channelId);
DescribeChannelUsersResponse response = client.getAcsResponse(request);
-
查詢房間開啟時間通路位址:/app/descChannelStartTime
當用戶端請求加入房間所需的 token 時,服務端查詢目前房間人數,若房間人數為 0,儲存目前時刻和房間 id。并把目前時刻作為此房間的建立時間。
DescribeChannelUsersResponse response = RtcOpenAPI.describeChannelUsers(appId, channelId);
if (CollectionUtils.isEmpty(response.getUserList())) {
ImmutablePair<String, String> appChannel = new ImmutablePair<>(appId, channelId);
ScheduledFuture scheduledFuture = TASKS.getOrDefault(appChannel, new JSONObject()).getObject("scheduledFuture", ScheduledFuture.class);
TASKS.put(appChannel, channelInfo);
}
JSONObject scheduledTask = ScheduledDeleteChannel.TASKS.get(ImmutablePair.of(app
內建iOS端
開發前的環境要求如下表所示,詳情請參見:
使用限制類别 | 說明 |
iPhone 裝置 | 支援 iPhone5 及以上。 |
系統版本 | 支援 iOS 8.0 及以上。 |
CPU 架構 | 支援真機架構 armv7+arm64,不支援模拟器 i386、x86 架構。 |
Xcode 版本 | 支援 Xcode9.0 及以上。下載下傳 Xcode |
其他 | 不支援 Bitcode,不支援螢幕旋轉。 |
您需要先內建服務端,具體操作,請參見
說明 您需要持有 Apple 開發證書或個人賬号。
Demo 運作指引
您在內建 iOS 端時,如果遇到問題,或者 Demo 體驗過程中出現無法建立房間或通話等問題,請參見
iOS 端運作常見問題-
- Demo 源碼中已經內建 AliRTC SDK(版本:1.17)。SDK 內建方式通過 CocoaPods 內建。
- 源碼壓縮檔案内分為 Server 端、Android 端、iOS 端三個檔案。
- 若遇到 GitHub 代碼庫下載下傳緩慢的問題,可通過安裝加速插件等方式加速下載下傳。
- 修改配置檔案。
-
- 打開解壓後的 Demo 檔案夾 AliRTC-UserCase-VoiceCallSolution_1To1-master,找到 iOS/demo/AlivcVoiceCallSolo/AlivcVoiceCallSolo/Utils/Http/AliBaseHttpClient.m檔案。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - 修改檔案中的
變量,如:AppServer
,部署到正式環境上建議綁定域名并使用:http://<伺服器IP> :8080/1v1-audio
。示例假設本地 IP 為 192.0.2.1,那麼http://<域名>/1v1-audio
。本地 IP 查詢,請參見 查詢 IP 位址 。注意BASE_URL="http://192.0.2.1:8080/1v1-audio"
- 打開解壓後的 Demo 檔案夾 AliRTC-UserCase-VoiceCallSolution_1To1-master,找到 iOS/demo/AlivcVoiceCallSolo/AlivcVoiceCallSolo/Utils/Http/AliBaseHttpClient.m檔案。
-
-
- 不要使用 127.0.0.1 的 IP。
- 手機和搭建伺服器的電腦處在一個區域網路中。
-
-
- 使用手機和電腦的浏覽器驗證。輸入正确的 URL(
變量)位址,即可在浏覽器中打開并看到:AppServer
。電腦端浏覽器正确通路說明 IP 和端口号無誤,手機端浏覽器正确通路說明目前手機可以正常通路到伺服器 IP。Hello RTC!
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端
- 使用手機和電腦的浏覽器驗證。輸入正确的 URL(
- 導入 Demo 源碼。打開 Xcode,單擊 Open a project or file,輕按兩下打開 demo 目錄下的 AlivcVoiceCallSoloClient.xcworkspace 檔案。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - 選擇運作 Target 為 AlivcVoiceCallSoloClient,将一台 IOS 真機裝置使用資料線與電腦連結,在 Xcode 中選擇相應的真機裝置,真機在設定中打開開發者模式。(暫不支援模拟器運作)
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 -
修改 Bundle Identifier 和開發者證書。
注意 Bundle Identifier 改成為
com.<公司名>.<項目名>
,避免由于 Bundle 已被注冊進而運作失敗。
General 頁籤中修改。
Sign & Capabilities 頁籤中修改。産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - 在 Sign & Capabilities 頁籤,勾選 Automatically manage signing,在下方選擇自己的 Team。
-
- 選擇 Team。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - 若以前沒添加過賬号,單擊 Add an Account 添加。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - 完成賬号添加。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - 在 Team 裡選擇新建立的賬号即可,并且在完成簽名後確定下方沒有報錯提示。
- 選擇 Team。
- 單擊 build and run 按鈕編譯。
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - 進行 1 對 1 語音聊天。
-
- 将 2 台真機移動端裝置(Android 或 iOS)裝上 Demo App。
- 将 2 台裝置都連接配接到同一區域網路下,保證可以連接配接到 Server 端。
- 在第一台真機上輸入任意房間号,建立房間并等待對方加入。
- 在第二台真機上輸入相同房間号加入房間并進行通話。
Demo 源碼解析
- 項目結構說明。說明Demo 是以 Cocoapods Lib 的方式內建到項目中的。
-
- RTC 把開發的業務代碼封裝到名稱為 AlivcVoiceCallSolo 的庫當中,這樣 AlivcVoiceCallSolo 就可以像一個本地的第三方庫一樣。可以随便移植到其他項目中,隻需在 Podfile 中指定 AlivcVoiceCallSolo 庫的路徑即可。如下所示:
pod 'AlivcVoiceCallSolo', :path => './AlivcVoiceCallSolo'
## pod 'AlivcVoiceCallSolo' 說明項目依賴AlivcVoiceCallSolo庫
## path => './AlivcVoiceCallSolo' 指明AlivcVoiceCallSolo庫的位置(相對于Podfile)
-
- 名詞解釋如下:
-
-
- pod:表示工程依賴 AlivcVoiceCallSolo 庫。
- path:表示 AlivcVoiceCallSolo 庫的路徑(相對 podfile 檔案)。
-
-
-
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端 - AlivcVoiceCallSolo 元件庫目錄說明,如下所示:
-
檔案名 | |
AlivcVoiceCallSolo.podspec | 元件的描述檔案。 |
AlivcVoiceCallSolo.bundle | 存放資源的 bundle。 |
AlivcVoiceCallChannelViewController | 首頁。 |
AlivcVoiceCallChattingViewController | 聊天頁。 |
AlivcDismissTransition | 轉場動畫。 |
AlivcPanInteractiveTransition | |
AlivcPresentTransition | |
AlivcVoiceCallSettingViewController | 設定頁。 |
AlivcVideoCallUserAuthrization | 工具類。 |
NSBundle+AlivcVoiceCallSolo | |
UIViewController+Alert | |
AliBaseHttpClient | 網絡請求。 |
AliRequestList |
-
-
産品百科 |零門檻搭建一個 1 對 1 語音聊天 Demo (iOS 版)內建服務端內建iOS端
-
- 功能實作。
-
- 建立并加入頻道。
//執行個體化AliRtcEngine并設定代理。
_engine = [AliRtcEngine sharedInstance:self extras:@""];
//擷取授權資訊。
//AliRtcAuthInfo:各項參數均需要客戶AppServer(客戶的server端)通過OpenAPI來擷取,然後AppServer下發至用戶端,用戶端将各項參數指派後,即可joinChannel。
AuthInfo *authInfo = "從server端擷取"
[_engine joinChannel:authInfo name:name onResult:^(NSInteger errCode) {
//加入頻道回調處理
if (errCode == 0) {
//加入房間成功
} else {
//加入房間失敗
}
}];
-
- 離開頻道。
//離開頻道。
[self.engine leaveChannel];
//銷毀SDK執行個體。
[AliRtcEngine destroy];
-
- 播放伴奏。
NSString *path = “檔案的路徑”
NSString *url = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//預加載音效檔案。
[self.engine preloadAudioEffectWithSoundId:soundId filePath:url];
//播放音效。
[self.engine playAudioEffectWithSoundId:soundId filePath:url cycles:1 publish:YES];
-
- 暫停伴奏。
[self.engine pauseAudioEffectWithSoundId:soundId];
-
- 停止伴奏。
[self.engine stopAudioEffectWithSoundId:soundId];
-
- 恢複播放伴奏。
[self.engine resumeAudioEffectWithSoundId:soundId];
-
- 靜音模式。
[self.engine muteLocalMic:YES];
-
- 取消靜音模式。
[self.engine muteLocalMic:NO];
-
- 開啟揚聲器。
[self.engine enableSpeakerphone:YES];
-
- 關閉揚聲器。
[self.engine enableSpeakerphone:NO];
「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。