WebRTC - Agora (声网)简介与实现音视频通话

yunjinwang 2019-06-28

Agora (声网)简介

官网: https://www.agora.io/cn/

一个专注移动端的高清实时通话云服务解决方案。

SD-RTN(Software Defined Real-time Network)
SD-RTN(Software Defined Real-time Network)是依赖于云计算技术并致力于全球实时音视频业务传输的“智简”网络,覆盖全球 200+ 国家。作为提供实时音视频业务的 PaaS(Platform as a Service)层,SD-RTN 专注为上层(SaaS)业务开放音视频业务的网络基础能力,解决开发者共性问题,营造友好的开发环境,实现敏捷开发,并为实时音视频业务打造“专网”级别沉浸式网络体验。

音频
高保真、3D 环绕立体声体验

视频
沉浸式视觉体验

Agora SDK
面向客户,轻松适配。
Agora SDK 意在灵活将 SDK 适配在更多新的需要实时传输应用场景如:IoT、教育、社交、金融、网络加速等。

Agora 原生 SDK
Agora 原生 SDK 支持 iOS,Android,Windows,和 Mac 等各平台。原生 SDK 包含了所有常用的音频和视频解码器,以及连接到 Agora 全球网络,并应对掉线和不稳定网络条件的算法。这是常用的高阶 API。

Agora 基于 Web 的 SDK
Agora 基于 Web 的 SDK 使基于 Web 开发的 App 能够实现原生应用同样的功能。

运用场景
语音通话(一对一、多对多)
视频通话(一对一、多对多)
互动直播(语音、视频直播连麦互动)
互动游戏(游戏内置实时语音、视频通话)
录制(服务端录制)
信令(呼叫、消息传递、状态同步等)


Agora (声网)实现音视频通话

下面实现一下音视频通话(一对一)的实现,主要分为两部分,一部分是视频通话,一部分是信令邀请其他人加入频道进行视频通话。

这里直接上代码:

创建视频通话

// 创建Client对象
client = AgoraRTC.createClient({ mode: 'live', codec: 'h264' });

// 初始化Client对象
client.init(
  'appid', // 这里填注册完后的APPID
  function() {
    console.log('AgoraRTC client 初始化成功');

    // 加入频道
    client.join(
      null,
      'call', // 频道名称,可以自己定义
      1111, // 用户标识id,可以自己定义。唯一就可以
      function(uid) {
        console.log('用户id:' + uid + ' 加入频道成功');

        // 创建音视频流
        localStream = AgoraRTC.createStream({
          streamID: uid,
          audio: true,
          video: true,
          screen: false,
        });

        // 初始化本地的音视频流
        localStream.init(
          function() {
            console.log('获取用户媒体成功');
            localStream.play('agora_video_myself'); // 显示本地视频播放<div>标签id名

            // 发布本地音视频流
            client.publish(localStream, function(err) {
              console.log('发布本地音视频流失败: ' + err);
            });

            client.on('stream-published', function(evt) {
              console.log('发布本地音视频流成功');
            });
          },
          function(err) {
            console.log('获取用户媒体失败', err);
          }
        );

           // --------- 订阅远端音视频流 --------
        // 监听到新的视频
        client.on('stream-added', function(evt) {
          var stream = evt.stream;
          console.log('有新的音视频流: ' + stream.getId());

          client.subscribe(stream, function(err) {
            console.log('订阅音视频流失败', err);
          });
        });
        // 订阅远程视频
        client.on('stream-subscribed', function(evt) {
          var remoteStream = evt.stream;
          console.log('订阅远程音视频流成功: ' + remoteStream.getId());
          remoteStream.play('agora_video'); // 显示远程视频播放<div>标签id名
        });
      },
      function(err) {
        console.log('加入频道失败', err);
      }
    );
  },
  function(err) {
    console.log('AgoraRTC client 初始化失败', err);
  }
);

信令发送邀请

// ------------------ 加载信令 ------------------

signal = Signal('appid'); // 这里填注册完后的APPID

// 登录返回 Session对象
session = signal.login(1111, '_no_need_token'); // 用户标识id,可以自己定义。唯一就可以

// 登录成功回调
session.onLoginSuccess = function(uid) {
  console.log('登录信令成功回调', uid);

  // ------------------ 邀请人加入频道
  const call = session.channelInviteUser2('call', userId); // 频道名称、被邀请人id
  // 对方已收到呼叫邀请回调
  call.onInviteReceivedByPeer = function() {
    console.log('对方已收到呼叫邀请');
  };
  // 对方接受邀请回调
  call.onInviteAcceptedByPeer = function() {
    console.log('对方接受邀请');
  };
  // 对方拒绝邀请回调
  call.onInviteRefusedByPeer = function() {
    console.log('对方拒绝邀请');
  };
  // 呼叫邀请失败回调
  call.onInviteFailed = function() {
    console.log('呼叫邀请失败');
  };
  // 对方已结束呼叫回调
  call.onInviteEndByPeer = function() {
    console.log('对方已结束呼叫');
  };
  // 本地已结束呼叫回调
  call.onInviteEndByMyself = function() {
    console.log('本地已结束呼叫');
  };
};

// 登录失败回调
session.onLoginFailed = function(ecode) {
  console.log('登录信令失败', ecode);
};

// 登出回调设置
session.onLogout = function(ecode) {
  console.log('登出信令成功', ecode);
};

退出时的销毁

// 取消发布本地音视频流
client.unpublish(localStream, function(err) {
  console.log('取消发布本地音视频流失败' + err);
});

// 退出频道
client.leave(
  function() {
    console.log('退出频道成功');
  },
  function(err) {
    console.log('退出频道失败', err);
  }
);

//登出信令
session.logout();

其他的更多功能可以查看官方的API