Agora 線上語音聊天室開發上手和原始碼解讀 | 掘金技術徵文

Waitta發表於2019-05-07

使用聲網的線上語音聊天室 SDK 能夠實現開黑聊天室、娛樂房間、K 歌房、FM 超高音質房等各種語音聊天室所需要的音訊功能。

場景描述

語音聊天室 是一種純音訊的使用場景。使用者作為主播或者聽眾加入房間進行語音聊天,也可以在房間內任意切換自己的主播/聽眾身份。

這個示例程式展示了對音訊設定有不同的需求的四種常見語音聊天室型別:

  • 開黑聊天室: 頻道內使用者需要頻繁上下麥,使用者不想花費過多流量
  • 娛樂房間: 頻道內使用者需要頻繁上下麥,使用者對流量使用不敏感,對音質有要求
  • K 歌房: 滿足唱歌場景需求,還原KTV效果
  • FM 超高音質房間: 超高音質,聲音還原度高,語音電臺主播首選

體驗 Demo

官方提供了 Demo 供你下載體驗。你可直接下載安裝 Android apk 安裝包 或者 iOS Appstore 進行體驗。

成功執行 Demo 後,在介面上建立房間,輸入頻道名稱,並選擇一種房間型別。使用另一臺裝置進入房間,即為觀眾觀看。觀眾可以申請上麥從而實現和房主的實時互動。

下載 Android 開發程式碼,進行本地開發測試

  1. 像以往使用聲網產品進行開發一樣,你需要先在 Agora.io 中建立自己的專案,並獲取到相應的 App ID。如果你還沒註冊,記得先註冊一下 dashboard.agora.io/cn/signup/。

Agora 線上語音聊天室開發上手和原始碼解讀 | 掘金技術徵文

  1. 下載 Agora 語音通話/語音直播 SDK

  2. 將有效的 AppID 填寫進 "Android/app/src/main/res/values/strings_config.xml"

<?xml version="1.0" encoding="UTF-8"?>

<resources>
    <!-- PLEASE KEEP THIS App ID IN SAFE PLACE -->
    <!-- Get your own App ID at https://dashboard.agora.io/ -->
    <!-- After you entered the App ID, remove <##> outside of Your App ID -->
    <!-- For formal released project, please use Security Keys/Token
        https://docs.agora.io/en/Video/token?platform=All%20Platforms -->
    <string name="private_app_id"><#YOUR APP ID#></string>
</resources>
複製程式碼

找到下面這一行,把你的 AppID 填寫進去。

<string name="private_app_id"><#YOUR APP ID#></string>
複製程式碼
  1. 解壓 SDK 壓縮包,將其中的 libs 資料夾下的 *.jar 複製到本專案的 app/libs 下,其中的 libs 資料夾下的 arm64-v8a/x86/armeabi-v7a 複製到本專案的 app/src/main/jniLibs 下。

  2. 使用 Android Studio 開啟該專案,連線 Android 測試裝置,編譯並執行。

執行環境:

  • Android Studio 3.1 +
  • Android SDK API Level >= 16
  • Android 4.1 或以上支援語音和視訊功能的真機裝置

功能列表

這個示例程式演示瞭如何使用 聲網 Agora 的音訊SDK,實現不同型別語音聊天室的音訊聊天功能。

  • 加入房間:選擇一個房間型別,使用主播或聽眾的身份加入房間,和房間內的其他使用者進行語音交流;
  • 主播/聽眾切換:在房間內可以隨時使用“上麥”按鈕來切換自己的主播/聽眾身份;
  • 聽筒/外放切換:可以使用“外放”按鈕切換聽筒或外放;
  • 停止傳送音訊:主播可以使用“靜音自己”按鈕停止傳送音訊;
  • 停止接收音訊:可以使用“不收音訊”按鈕停止接收房間內其他人的音訊;
  • 音樂伴奏:主播可以使用“伴奏”按鈕播放伴奏音樂併傳送給房間內其他人;
  • 變聲效果:主播可以使用“變聲”按鈕選擇自己的變聲效果。

原始碼解讀

在體驗了 SDK 的基本功能後,讓我們看看原始碼,這些功能是如何實現的。

在檔案 Chatroom/Android/app/src/test/java/io/agora/chatroom/ExampleUnitTest.java 中,我們可以看到,這是一個簡單的單元測試:

package io.agora.chatroom;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}
複製程式碼

Mainfest 中是進行基本設定,Chatroom/Android/app/src/main/AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="io.agora.chatroom">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.BLUETOOTH" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".RoomActivity"
            android:screenOrientation="portrait"/>
    </application>

</manifest>
複製程式碼

此外,在 Chatroom/Android/app/src/androidTest/java/io/agora/chatroom/ExampleInstrumentedTest.java 這裡我們還可以看到 Instrumente 測試用例,這個 SDK 的測試用例可以說是比較完善了。

package io.agora.chatroom;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumentation test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("io.agora.chatroom", appContext.getPackageName());
    }
}
複製程式碼

當然,真正核心的程式碼是在這裡 Chatroom/Android/app/src/main/java/io/agora/。

首先在 Chatroom/Android/app/src/main/java/io/agora/utils/Constant.java 這裡進行了一些定義。

package io.agora.utils;

/**
 * Created by yt on 2018/8/15/015.
 */

public class Constant {
    // 開黑聊天室
    public static final int ChatRoomGamingStandard = 0x01;
    // 娛樂聊天室
    public static final int ChatRoomEntertainmentStandard = 0x02;
    // K 歌房
    public static final int ChatRoomEntertainmentHighQuality = 0x03;
    // FM 超高音質
    public static final int ChatRoomGamingHighQuality = 0x04;

    // 開黑聊天室
    public static final String ChatRoomGamingStandardName = "ChatRoomGamingStandard";
    // 娛樂聊天室
    public static final String ChatRoomEntertainmentStandardName = "ChatRoomEntertainmentStandard";
    // K 歌房
    public static final String ChatRoomEntertainmentHighQualityName = "ChatRoomEntertainmentHighQuality";
    // FM 超高音質
    public static final String ChatRoomGamingHighQualityName = "ChatRoomGamingHighQuality";

    public static final String ACTION_KEY_CROLE = "C_Role";
    public static final String ACTION_KEY_ROOM_MODE = "ecHANELMODE";
    public static final String ACTION_KEY_ROOM_NAME = "ecHANEL";
    public static final String ACTION_KEY_TITLE_NAME = "eTITLE";

    public static String[] SOUNDARRAY = new String[] {
            "大叔","正太","豬八戒","空靈",
            "浩克","蘿莉","電臺KTV","演唱會",
            "錄音棚", "流行", "R&B", "嘻哈", "搖滾"
    };
}
複製程式碼

在這裡 Chatroom/Android/app/src/main/java/io/agora/adapter/UsesAdapter.java 進行了使用者列表的適配。

在這裡 Chatroom/Android/app/src/main/java/io/agora/chatroom/RoomActivity.java 可以看到,聊天室內的這些互動功能是如何實現的,很值得學習。程式碼有些長,我就不貼出來了。

在這裡 Chatroom/Android/app/src/main/java/io/agora/chatroom/User.java 實現了聊天室的使用者判斷。

感興趣的,建議你到 官方庫 github.com/AgoraIO-Use… 看詳細程式碼,並下載體驗一下。


Agora SDK 使用體驗徵文大賽 | 掘金技術徵文,徵文活動正在進行中

相關文章