在互聯網快速發展的時代,用戶體驗 能夠說是一個重要的關鍵詞,不論什麼樣的產品,都要考慮的是用戶的一個真實感覺,同類型的產品,有不少,可是用的舒服的,方便的,寥寥無幾,這就是致使了市面上爲何產品有不少,可是真正作的好的,就那麼幾款。javascript
相比於直播,音頻視頻通話能夠更直觀的讓用戶接收或者發送,甚至是參與到直播的氛圍當中,今天,咱們就用 聲網Agora 的音頻通話功能,實現一個簡單的音頻通話功能(包括官網案例優化)。java
這是 聲網Agora 官網登錄後的首頁,紅框建立一個項目;編程
默認登錄是英文,右上角設置能夠修改語言;api
建立完成後,會有一個這樣的項目,App ID
在咱們項目當中,會用到;app
首先,咱們要建立一個 Client
的對象:異步
let client = AgoraRTC.createClient({mode: 'live', codec: "h264"});
複製代碼
而後初始化一下 client
對象,初始化後可使用 Agora SDK
,進行加入頻道、發佈和訂閱音頻流;ide
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
方法。post
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
去作自定義了:
整體產品的體驗仍是不錯的,最起碼在使用者角度來講,很簡單,很便捷,就是在 回調 部分,會比較麻煩,這是一個須要檢查一下是否能夠優化的地方
由於對於一些對異步編程理解不是很透徹的開發來講,這樣的後期維護,成本很高