在互联网快速发展的时代,用户体验 能够说是一个重要的关键词,不论什么样的产品,都要考虑的是用户的一个真实感觉,同类型的产品,有不少,可是用的舒服的,方便的,寥寥无几,这就是致使了市面上为何产品有不少,可是真正作的好的,就那么几款。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
去作自定义了:
整体产品的体验仍是不错的,最起码在使用者角度来讲,很简单,很便捷,就是在 回调 部分,会比较麻烦,这是一个须要检查一下是否能够优化的地方
由于对于一些对异步编程理解不是很透彻的开发来讲,这样的后期维护,成本很高