主頁 >  其他 > Unity 語音和視頻通話快速解決方案——聲網 SDK接入指南(Android)

Unity 語音和視頻通話快速解決方案——聲網 SDK接入指南(Android)

2020-11-16 23:46:36 其他

Unity 語音和視頻通話快速解決方案——聲網 SDK接入指南(Android)

一、前言

當前游戲為了增加社互動動和代入感,比如狼人殺、團隊競技游戲等,經常會產生需要實時語音和視頻通話的需求,但是對于個人開發者和小團隊,這種需要前后端配合,重網路的開發需求會帶來很大的挑戰,

為此我們需要尋找一個成熟、可靠的解決方案,每個月提供 10000 分鐘免費使用時長的聲網 Agora成為了我的最佳選擇,并且聲網的 SDK(Software Development Kit) 包體積很小,運行時CPU和記憶體占用率低,對于移動端的游戲開發很友好,2019年7月聲網正式成為了 Unity 官方認證合作伙伴,語音和視頻的 SDK 也已經發布在了 Unity 資源商店中,能夠非常方便的接入,

注意:語音和視頻的包有沖突,不兼容(一些庫和平臺配置不同,可以自己手動修改),請根據需求,第四步和第五步二選一,引擎支持開關視頻和聲音,所以可以接入視頻 SDK 包,關閉視頻,僅僅使用語音通話,

二、后臺創建應用

為了方便后續接入操作,這里先注冊和登錄到 官方后臺 創建應用,獲取我們之后需要的 App ID,可以根據官網的新手引導來創建應用,也可以參考如下步驟,

輸入專案名稱,目前暫時使用 APP ID 的鑒權模式,后續根據需要也可以在專案編輯界面切換到 Token 鑒權模式,該模式更加安全,生成 Token 程式需要搭建在服務器上,可以參考官方檔案,

創建成功后,我們點擊 APP ID 下的顯示按鈕,APPID 就會復制到粘貼板,

三、獲取 SDK

這里我使用的 Unity 版本為 2019.3.14,進入商店我們搜索 Agora,可以發現視頻和語音兩個 SDK 包,

如果打不開 Unity Store 的同學還可以從官網開發者中心下載,

四、接入 Agora Voice 語音 SDK

1. 匯入工程

從 Asset Store 的我的資源(My Asset)中找到我們下載的 Agora Voice SDK For Unity ,點擊 Import 匯入到工程中,


匯入的檔案結構如下,

  • Demo:官方提供的測驗語音 Demo
  • Edior:iOS 構建后處理腳本
  • Plugins:不同平臺所依賴的庫
  • Scripts:SDK 原始碼

2. 搭建測驗場景

為了驗證 Agora Voice 的效果,我們打開官方的 Demo,或者是自己搭建一個類似的簡單場景,主要有三個按鈕,分別用來測驗加入頻道、離開頻道和靜音,

3. 申請麥克風權限

在 Unity 2018.3 版本以后的新版本中,需要我們主動申請麥克風權限,

#if(UNITY_2018_3_OR_NEWER)
using UnityEngine.Android;
#endif
// ...
    private void PermissionRequest()
    {
#if (UNITY_2018_3_OR_NEWER)
			if (!Permission.HasUserAuthorizedPermission(Permission.Microphone))	// 判斷是否有麥克風權限
			{
				Permission.RequestUserPermission(Permission.Microphone);	// 申請麥克風權限
			}
#endif
    }
// ...

4. 初始化 IRtcEngine

我們在呼叫 Agora 的介面前,需要先初始化 IRtcEngine,此時我們第二步獲取的 APP ID,就在這里派上用處了,在通過 APP ID 創建 IRtcEngine 后,可以根據需求增加回呼事件,這里我接入了一些比較常用的回呼,

using agora_gaming_rtc;
// ...
    private IRtcEngine mRtcEngine = null;
    public const string APP_ID = "你自己的應用 APP ID";
	private void InitEngine()
    {
    	// 通過 APP ID 創建
        mRtcEngine = IRtcEngine.GetEngine(APP_ID);
        
        // 加入頻道成功后的回呼
        // channelName:頻道名稱
        // uid:用戶ID(發起請求時候如果沒有指定,服務器會自動分配一個)
        // elapsed:從本地用戶呼叫 JoinChannelByKey 到該回呼觸發的延遲(毫秒),
        mRtcEngine.OnJoinChannelSuccess += (string channelName, uint uid, int elapsed) =>
        {
            // ...
        };
		
        
        // 離開頻道的回呼
        // stats:通話統計的資料
        //		duration:通話時長
        //		txBytes:發送位元組數(bytes)
        //		rxBytes:接收位元組數(bytes)
        //		txKBitRate:發送碼率(kbps)
        //		rxKBitRate:接收碼率(kbps)
        mRtcEngine.OnLeaveChannel += (RtcStats stats) =>
        {
            string leaveChannelMessage = string.Format("onLeaveChannel callback duration {0}, tx: {1}, rx: {2}, tx kbps: {3}, rx kbps: {4}", stats.duration, stats.txBytes, stats.rxBytes, stats.txKBitRate, stats.rxKBitRate);
			// ...
        };
		
        // 用戶加入回呼
        // uid:新加入頻道的遠端用戶/主播 ID
        // elapsed:從本地用戶呼叫 JoinChannelByKey 到該回呼觸發的延遲(毫秒),
        mRtcEngine.OnUserJoined += (uint uid, int elapsed) =>
        {
			// ...
        };
		
        // 用戶離開回呼
        // uid:離線用戶或主播的用戶 ID
        // reason:離線原因(主動離開、超時、直播模式身份切換)
        mRtcEngine.OnUserOffline += (uint uid, USER_OFFLINE_REASON reason) =>
        {
            string userOfflineMessage = string.Format("onUserOffline callback uid {0} {1}", uid, reason);
            Debug.Log(userOfflineMessage);
        };
		
        // 提示頻道內誰在說話
        // speakers:說話人資訊
        // speakerNumber:說話人數[0,3]
        // totalVolume:總音量
        mRtcEngine.OnVolumeIndication += (AudioVolumeInfo[] speakers, int speakerNumber, int totalVolume) =>
        {
            // ...
        };
	
        // 用戶靜音提示回呼
        // uid:用戶 ID
        // muted:是否靜音
        mRtcEngine.OnUserMutedAudio += (uint uid, bool muted) =>
        {
            // ...
        };
		
        // 發生警告回呼
        mRtcEngine.OnWarning += (int warn, string msg) =>
        {
            // ...
        };
		
        // 發生錯誤回呼
        mRtcEngine.OnError += (int error, string msg) =>
        {
            // ...
        };
		
        // 當前通話統計回呼,每兩秒觸發一次,
        mRtcEngine.OnRtcStats += (RtcStats stats) =>
        {
            // ...
        };
		
        // 語音路由已發生變化回呼,(只在移動平臺生效)
        mRtcEngine.OnAudioRouteChanged += (AUDIO_ROUTE route) =>
        {
            // ...
        };
		
        // Token 過期回呼
        mRtcEngine.OnRequestToken += () =>
        {
            // ...
        };
		
        // 網路中斷回呼(建立成功后才會觸發)
        mRtcEngine.OnConnectionInterrupted += () =>
        {
            // ...
        };
		
        // 網路連接丟失回呼
        mRtcEngine.OnConnectionLost += () =>
        {
            // ...
        };
		
	    // 設定 Log 級別
        mRtcEngine.SetLogFilter(LOG_FILTER.INFO);
		// 設定為自由說話模式,常用于一對一或者群聊
        mRtcEngine.SetChannelProfile(CHANNEL_PROFILE.CHANNEL_PROFILE_COMMUNICATION);
    }
...

5. 常用 API

5.1 加入頻道

    public void JoinChannel()
    {
        // 從界面的輸入框獲取頻道名稱
        string channelName = mChannelNameInputField.text.Trim();

        Debug.Log(string.Format("tap joinChannel with channel name {0}", channelName));

        if (string.IsNullOrEmpty(channelName))
        {
            return;
        }
		// 加入頻道
        // channelKey: 動態秘鑰,我們最開始沒有選擇 Token 模式,這里就可以傳入 null;否則需要傳入服務器生成的 Token
        // channelName: 頻道名稱
        // info: 開發者附帶資訊(非必要),不會傳遞給頻道內其他用戶
        // uid: 用戶ID,0 為自動分配
        mRtcEngine.JoinChannelByKey(channelKey: null, channelName: channelName, info:"extra",uid: 0);
    }

5.2 靜音

    void MuteButtonTapped()
    {
        string labeltext = isMuted ? "靜音" : "取消靜音";
        Text label = muteButton.GetComponentInChildren<Text>();
        if (label != null)
        {
            label.text = labeltext;
        }
        isMuted = !isMuted;
        // 設定靜音(停止推送本地音頻)
        mRtcEngine.MuteLocalAudioStream(!isMuted);
    }

5.3 離開頻道 & 銷毀 IRtcEngine

    public void LeaveChannel()
    {
        // 離開頻道
        mRtcEngine.LeaveChannel();
        string channelName = mChannelNameInputField.text.Trim();
        Debug.Log(string.Format("left channel name {0}", channelName));
    }

    void OnApplicationQuit()
    {
        if (mRtcEngine != null)
        {
            // 銷毀 IRtcEngine
            IRtcEngine.Destroy();
            mRtcEngine = null;
        }
    }

6. 最終效果

我們可以先在編輯器上驗證,能夠正常運行后,將平臺切換到 Android 后,直接出包就行,Agora SDK 中已經提供了 Android 中所需要的庫,

最后運行在 Android 上的效果如下:

  1. 輸入1234 成功加入頻道,分配給我們用戶 id:1186284123
  2. 有其他用戶加入,用戶id:2996662973
  3. 用戶id:2996662973 開啟靜音
  4. 用戶id:2996662973 離開頻道
  5. 我們離開頻道,顯示通話統計資料

語音通話的 API 時序圖如下:

五、接入 Agora Video 視頻 SDK

1. 匯入工程

如果你按照第五步匯入過音頻了,這里類似直接從商店匯入 Agora Video SDK,要注意的是兩個包的內容不同,當然兩個 SDK 包的本質還是相同的,只是不同平臺中的配置相關有些不同,如果同時使用,會出現問題,有能力的同學也可以嘗試修改兼容,這里還是比較推薦直接洗掉音頻 Voice 的包,再匯入新的 Video 的包,這樣就不用我們費盡的設定不同平臺配置了,

2. 搭建測驗場景

同樣的我們可以直接使用Demo 中提供的場景,SceneHome 是啟動場景,在最后測驗的時候,注意需要修改 Build Setting 中場景串列,或者可以搭建一個簡易如下的場景,

3. 申請麥克風+相機權限

與音頻不同,視頻需要我們添加相機權限的申請,

    private void PermissionRequest () {
#if (UNITY_2018_3_OR_NEWER)
        if (!Permission.HasUserAuthorizedPermission (Permission.Microphone)) {
            Permission.RequestUserPermission (Permission.Microphone);
        }
        // 增加相機權限
        if (!Permission.HasUserAuthorizedPermission (Permission.Camera)) {
            Permission.RequestUserPermission (Permission.Camera);
        }
#endif
    }

4. 初始化 IRtcEngine

與音頻唯一不同的是需要打開視頻功能,

 private void InitEngine () {
        mRtcEngine = IRtcEngine.GetEngine (APP_ID);
        // 啟用視頻
        mRtcEngine.EnableVideo ();
        // 允許相機回呼
        mRtcEngine.EnableVideoObserver ();

     // 后續與音頻相同添加回呼...
 }

5. 常用 API

5.1 設定自己畫面

官方已經提供好了一個用于顯示的 VideoSurface 類,我們只要把它添加到需要顯示的物件上即可,默認顯示的即為自己相機拍攝畫面,

    private void CreateMyCamera()
    {
        GameObject myCamera = GameObject.Find("MyCamera");
        if (ReferenceEquals(myCamera, null))
        {
            Debug.LogError("沒有找到 MyCamera 物件!");
            return;
        }
        else
        {
            // 添加顯示畫面類
            myCamera.AddComponent<VideoSurface>();
            // 畫面需要垂直翻轉
            myCamera.transform.Rotate(0f, 0.0f, 180.0f);
        }
    }

5.2 設定其他用戶畫面

    private void CreateUserCamera(uint uid)
    {
        VideoSurface videoSurface;
        GameObject userCamera = GameObject.Find("UserCamera");
        if (ReferenceEquals(userCamera, null))
        {
            Debug.LogError("沒有找到 UserCamera 物件!");
            return;
        }
        else
        {
            videoSurface = userCamera.AddComponent<VideoSurface>();
            userCamera.transform.Rotate(0f, 0.0f, 180.0f);

        }
        // 設定顯示用戶
        videoSurface.SetForUser(uid);
        videoSurface.SetEnable(true);
        // 設定平面型別
        videoSurface.SetVideoSurfaceType(AgoraVideoSurfaceType.RawImage);
        // 設定畫面幀率
        videoSurface.SetGameFps(30);
    }

5.3 開關視頻

我們可以在應用暫停的時候,停止視頻,畫面將不會再更新,

    public void EnableVideo(bool pauseVideo)
    {
        if (mRtcEngine != null)
        {
            if (!pauseVideo)
            {
                // 啟動視頻
                mRtcEngine.EnableVideo();
            }
            else
            {
                // 關閉視頻
                mRtcEngine.DisableVideo();
            }
        }
    }

6. 最終效果

最后在 Android 上運行的效果如下:

  1. 我們加入到 123 頻道
  2. 給我們分配id 722438456,并顯示出我們自己的畫面
  3. 顯示頻道內另一個用戶 1173951071 的畫面
  4. 離開頻道,視頻畫面停止

視頻通話的 API 時序圖如下:

六、總結

總的來說,聲網的接入還是較為簡單的,我們可以從商店匯入對應的包,就能夠直接使用,最麻煩的不同平臺的配置,官方已經幫忙解決了,而且通話和視頻質量不錯,再加上有免費使用時長,對于開發者來說是相當友好的,具體細節官方檔案說的也比較清楚,

幾行就搞定了麻煩的語音和視頻,光速下班,真香,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/220852.html

標籤:其他

上一篇:散列沖突解決的方式

下一篇:Pandas概論

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more