前言
在網際網路快速發展的時代,使用者體驗 可以說是一個重要的關鍵詞,不論什麼樣的產品,都要考慮的是使用者的一個真實感受,同型別的產品,有很多,但是用的舒服的,方便的,寥寥無幾,這就是導致了市面上為什麼產品有很多,但是真正做的好的,就那麼幾款。
相比於直播,音訊視訊通話可以更直觀的讓使用者接收或者傳送,甚至是參與到直播的氛圍當中,今天,我們就用 聲網Agora 的音訊通話功能,實現一個簡單的音訊通話功能(包括官網案例優化)。
正文
專案建立
這是 聲網Agora 官網登陸後的首頁,紅框建立一個專案;
預設登陸是英文,右上角設定可以修改語言;
建立完成後,會有一個這樣的專案,App ID
在我們專案當中,會用到;
例項化物件
首先,我們要建立一個 Client
的物件:
let client = AgoraRTC.createClient({mode: 'live', codec: "h264"});
複製程式碼
然後初始化一下 client
物件,初始化後可以使用 Agora SDK
,進行加入頻道、釋出和訂閱音訊流;
let init = new Promise((resolve, reject) => {
client.init('這裡是 APP ID', resolve, reject);
});
let initResolve = init.then(resolve => {
console.log("初始化完成");
});
initResolve.catch(reject => {
console.log("初始化失敗");
});
複製程式碼
這裡的 app id
就是在專案建立以後,獲取到的 id
;
官方的案例,使用的不是 Promise ,是回撥的 function
這樣的話,後期會有很多的回撥,會造成回撥地獄的情況,不利於維護,所以我使用的是 Promise
複製程式碼
初始化 Client 物件完成後, 在成功的回撥中呼叫 client.join
方法。
var joinChannel = new Promise((resolve, reject) => {
client.join(null, "123", null, resolve, reject);
});
var joinChannelResolve = joinChannel.then(uid => {
console.log("使用者 " + uid + " 加入頻道成功");
localStream.play('agora_local');
});
joinChannelResolve.catch(reject => {
console.log("加入頻道失敗", reject);
});
複製程式碼
在加入頻道成功後,建立一個音訊流物件,然後初始化一下:
var localStream = AgoraRTC.createStream({
streamID: uid,
audio: true,
video: false,
screen: false
});
return new Promise((resolve, reject) => {
localStream.init(resolve, reject);
});
複製程式碼
初始化完成後,在成功的回撥中通過 client.publish
方法釋出音訊流:
client.publish(localStream, err => {
console.log("傳送本地流錯誤: " + err);
});
client.on('stream-published', evt => {
console.log("成功釋出本地流");
});
複製程式碼
在建立好後,就可以用來發布音訊了。
完整程式碼用例:
let client = AgoraRTC.createClient({ mode: "live", codec: "h264" });
let init = new Promise((resolve, reject) => {
client.init('這裡是 APP ID', resolve, reject);
});
let initResolve = init.then(resolve => {
console.log("初始化完成");
return new Promise((resolve, reject) => {
client.join(null, "123", null, resolve, reject);
});
});
let joinChannelResolve = initResolve.then(uid => {
console.log("使用者 " + uid + " 加入頻道成功");
let localStream = AgoraRTC.createStream({
streamID: uid,
audio: true,
video: false,
screen: false
});
return new Promise((resolve, reject) => {
localStream.init(resolve, reject);
});
});
let localStreamPromiseResolve = joinChannelResolve.then(localStream => {
console.log("成功獲得使用者媒體");
localStream.play("agora_local");
});
localStreamPromiseResolve.catch(reject => {
console.log("獲取使用者媒體失敗", reject);
});
joinChannelResolve.catch(reject => {
console.log("加入頻道失敗", reject);
});
initResolve.catch(reject => {
console.log("初始化失敗");
});
複製程式碼
程式碼層面的東西,其實對於基礎應用來說,很簡單,如果追求高質量,高效能的使用者體驗,那就要根據官網提供的 api
去做自定義了:
結束語
總體產品的體驗還是不錯的,最起碼在使用者角度來說,很簡單,很便捷,就是在 回撥 部分,會比較麻煩,這是一個需要檢查一下是否可以優化的地方
因為對於一些對非同步程式設計理解不是很透徹的開發來說,這樣的後期維護,成本很高