写点什么

基于 Agora Web SDK 实现一对一视频通话

  • 2020-02-25
  • 本文字数:7566 字

    阅读完需:约 25 分钟

基于 Agora Web SDK 实现一对一视频通话

本文会详细介绍如何建立一个简单的项目并使用 Agora Web SDK 实现基础的一对一视频通话。


由于浏览器的安全策略对除 127.0.0.1 以外的 HTTP 地址作了限制,Agora Web SDK 仅支持 HTTPS 协议或者 http://localhosthttp://127.0.0.1),请勿使用 HTTP 协议部署你的项目。

Demo 体验

我们在 GitHub 上提供一个开源的基础一对一视频通话示例项目,在开始开发之前你可以通过该示例项目体验音视频通话效果。


Github:https://github.com/AgoraIO/Basic-Video-Call/tree/master/One-to-One-Video/Agora-Web-Tutorial-1to1

开发条件

  1. 安装一款 Agora Web SDK 支持的浏览器,如下表所示:

  2. 获得一个有效的 Agora 账号。

  3. 注:如果你的网络环境部署了防火墙,请根据声网文档中心的「应用企业防火墙限制」打开相关端口。

设置开发环境

你需要准备一个自己的项目并且将 Agora Web SDK 集成到其中。

创建 Web 项目

如果你已经有一个 Web 项目了,跳过本小节,直接阅读集成 SDK。


我们提供的示例代码使用了一些第三方的库文件来实现页面的样式和布局,你可以访问本文开篇的 Github 地址,在文件夹「vendor」中获得以下文件,或者使用其他方式实现。


  • common.css

  • jquery.min.js

  • materialize.min.js


以下为示例:


这个项目只需要用到一个 HTML 文件。


  1. 新建一个 HTML 文件。这里我们将文件命名为 index.html(以下简称项目文件)。

  2. 用一个代码编辑器(例如 VS Code)打开该文件。

  3. 复制以下代码,粘贴到项目文件中。

  4. 该步骤会为你的项目创建前端页面的 UI。这里我们直接用了 Agora 示例项目中的代码,你也可以自定义你的 UI。


<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="ie=edge"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><title>Basic Communication</title><link rel="stylesheet" href="./assets/common.css" /></head><body class="agora-theme"><div class="navbar-fixed"> <nav class="agora-navbar">   <div class="nav-wrapper agora-primary-bg valign-wrapper">     <h5 class="left-align">Basic Communication</h5>   </div> </nav></div><form id="form" class="row col l12 s12"> <div class="row container col l12 s12">   <div class="col" style="min-width: 433px; max-width: 443px">     <div class="card" style="margin-top: 0px; margin-bottom: 0px;">       <div class="row card-content" style="margin-bottom: 0px;">           <div class="input-field">             <label for="appID" class="active">App ID</label>             <input type="text" placeholder="App ID" name="appID">           </div>           <div class="input-field">             <label for="channel" class="active">Channel</label>             <input type="text" placeholder="channel" name="channel">           </div>           <div class="input-field">             <label for="token" class="active">Token</label>             <input type="text" placeholder="token" name="token">           </div>           <div class="row" style="margin: 0">             <div class="col s12">             <button class="btn btn-raised btn-primary waves-effect waves-light" id="join">JOIN</button>             <button class="btn btn-raised btn-primary waves-effect waves-light" id="leave">LEAVE</button>             <button class="btn btn-raised btn-primary waves-effect waves-light" id="publish">PUBLISH</button>             <button class="btn btn-raised btn-primary waves-effect waves-light" id="unpublish">UNPUBLISH</button>             </div>           </div>       </div>     </div>   </div>   <div class="col s7">     <div class="video-grid" id="video">       <div class="video-view">         <div id="local_stream" class="video-placeholder"></div>         <div id="local_video_info" class="video-profile hide"></div>         <div id="video_autoplay_local" class="autoplay-fallback hide"></div>       </div>     </div>   </div> </div></form><script src="vendor/jquery.min.js"></script><script src="vendor/materialize.min.js"></script></body></html>
复制代码

集成 SDK

选择如下任意一种方法获取 Agora Web SDK:


方法 一、 使用 npm 获取 SDK


  1. 运行安装命令


npm install agora-rtc-sdk
复制代码


2.在你的项目的 Javascript 代码中添加一行:


import AgoraRTC from 'agora-rtc-sdk'
复制代码


方法 二、 使用 CDN 方法获取 SDK


该方法无需下载安装包。在项目文件中,将以下代码添加到上一行:</p><pre><code>&lt;script&nbsp;src=&quot;https://cdn.agora.io/sdk/release/AgoraRTCSDK-3.0.0.js&quot;&gt;&lt;/script&gt;<br/></code></pre><p>方法 三、 从官网获取 SDK</p><ol><li>下载最新版 Agora Web SDK 软件包。</li><li>将下载下来的软件包中的 AgoraRTCSDK-3.0.0.js 文件保存到项目文件所在的目录下。</li><li>在项目文件中,将如下代码添加到<style>上一行:</li></ol><script src="./AgoraRTCSDK-3.0.0.js"></script><p>为方便起见,这里我们选择第二种方法,直接使用 CDN 链接。<br/>现在,我们已经将 Agora Web SDK 集成到项目中了。接下来我们要通过调用 Agora Web SDK 提供的核心 API 实现基础的音视频通话功能。</p><h2>实现音视频通话</h2><p>接下来介绍如何使用 Agora Web SDK 实现音视频通话。<br/>在使用 Agora Web SDK 时,你会经常用到以下两种对象:</p><ul><li>Client 对象,代表一个本地客户端。Client 类的方法提供了音视频通话的主要功能,例如加入频道、发布音视频流等。</li><li>Stream 对象,代表本地和远端的音视频流。Stream 类的方法用于定义音视频流对象的行为,例如流的播放控制、音视频的编码配置等。调用 Stream 方法时,请注意区分本地流和远端流对象。<br/>下图展示了基础的一对一音视频通话的 API 调用。注意图中的方法是对不同的对象调用的。<br/><img src="https://static001.infoq.cn/resource/image/9b/a2/9b659fdab4e59369fce81f3f0adc22a2.png" alt=""/></li></ul><p>注:本文只介绍 Agora Web SDK 最基础的方法和回调。完整的 API 方法和回调详见声网文档中心 Web API 参考。</p><p>为方便起见,我们为下面要用到的示例代码定义了两个变量。此步骤不是必须的,你可以根据你的项目有其他的实现。</p><pre><code>//&nbsp;rtc&nbsp;object<br/>var&nbsp;rtc&nbsp;=&nbsp;{<br/>&nbsp;&nbsp;client:&nbsp;null,<br/>&nbsp;&nbsp;joined:&nbsp;false,<br/>&nbsp;&nbsp;published:&nbsp;false,<br/>&nbsp;&nbsp;localStream:&nbsp;null,<br/>&nbsp;&nbsp;remoteStreams:&nbsp;[],<br/>&nbsp;&nbsp;params:&nbsp;{}<br/>};<br/><br/>//&nbsp;Options&nbsp;for&nbsp;joining&nbsp;a&nbsp;channel<br/>var&nbsp;option&nbsp;=&nbsp;{<br/>&nbsp;&nbsp;appID:&nbsp;&quot;Your&nbsp;App&nbsp;ID&quot;,<br/>&nbsp;&nbsp;channel:&nbsp;&quot;Channel&nbsp;name&quot;,<br/>&nbsp;&nbsp;uid:&nbsp;null,<br/>&nbsp;&nbsp;token:&nbsp;&quot;Your&nbsp;token&quot;<br/>}<br/></code></pre><h2>加入频道</h2><ol><li>加入频道前,我们需要先创建并初始化一个客户端对象。</li></ol><pre><code>//&nbsp;Create&nbsp;a&nbsp;client<br/>rtc.client&nbsp;=&nbsp;AgoraRTC.createClient({mode:&nbsp;&quot;rtc&quot;,&nbsp;codec:&nbsp;&quot;h264&quot;});<br/><br/>//&nbsp;Initialize&nbsp;the&nbsp;client<br/>rtc.client.init(option.appID,&nbsp;function&nbsp;()&nbsp;{<br/>&nbsp;&nbsp;console.log(&quot;init&nbsp;success&quot;);<br/>&nbsp;&nbsp;},&nbsp;(err)&nbsp;=&gt;&nbsp;{<br/>&nbsp;&nbsp;console.error(err);<br/>});<br/></code></pre><p>在 AgoraRTC.createClient 方法中,需注意 mode 和 codec 这两个参数的设置:</p><ul><li>mode 用于设置频道模式。一对一或多人通话中,建议设为 “rtc” ,使用通信模式;互动直播中,建议设为 “live”,使用直播模式。</li><li>codec 用于设置浏览器使用的编解码格式。如果你需要使用 Safari 12.1 及之前版本,将该参数设为 “h264”;如果你需要在手机上使用 Agora Web SDK,请参考声网文档中心「移动端使用 Web SDK」页面。<br/>你需要在该步骤中填入项目的 App ID。请参考如下步骤在控制台创建 Agora 项目并获取 App ID:<br/>a. 登录控制台,点击左侧导航栏的项目管理图标 。</li></ul><p>b. 点击创建,按照屏幕提示设置项目名,选择一种鉴权机制,然后点击提交。</p><p>c. 在项目管理页面,你可以获取该项目的 App ID。</p><p>为方便演示,我们的示例项目在网页上设置了一个文本框用于输入 App ID。在实际的应用中,App ID 应该是在代码中填写的。</p><ol start="2"><li>在 Client.init 的 onSuccess 回调中调用 Client.join 加入频道。</li></ol><pre><code>//&nbsp;Join&nbsp;a&nbsp;channel<br/>rtc.client.join(option.token&nbsp;?&nbsp;option.token&nbsp;:&nbsp;null,&nbsp;option.channel,&nbsp;option.uid&nbsp;?&nbsp;+option.uid&nbsp;:&nbsp;null,&nbsp;function&nbsp;(uid)&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;console.log(&quot;join&nbsp;channel:&nbsp;&quot;&nbsp;+&nbsp;option.channel&nbsp;+&nbsp;&quot;&nbsp;success,&nbsp;uid:&nbsp;&quot;&nbsp;+&nbsp;uid);<br/>&nbsp;&nbsp;&nbsp;&nbsp;rtc.params.uid&nbsp;=&nbsp;uid;<br/>&nbsp;&nbsp;},&nbsp;function(err)&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;console.error(&quot;client&nbsp;join&nbsp;failed&quot;,&nbsp;err)<br/>})<br/></code></pre><p>在 Client.join 中注意以下参数的设置:<br/>更多的参数设置注意事项请参考 Client.join 接口中的参数描述。</p><ul><li>在测试环境,我们推荐使用控制台生成临时 Token,详见获取临时 Token。</li><li>在生产环境,我们推荐你在自己的服务端生成 Token,详见 生成 Token.</li><li>token: 该参数为可选。如果你的 Agora 项目开启了 App 证书,你需要在该参数中传入一个 Token。</li><li>channel: 频道名,长度在 64 字节以内的字符串。</li><li>uid: 用户 ID,频道内每个用户的 UID 必须是唯一的。如果你将 uid 设为 null,Agora 会自动分配一个 UID 并在 onSuccess 回调中返回。</li></ul><h2>发布本地流</h2><ol><li>在 Client.join 的 onSuccess 回调中调用 AgoraRTC.createStream 方法创建一个本地音视频流。<br/>在创建流时,通过设置 audio 和 video 参数来控制是否发布音频和视频。</li></ol><pre><code>//&nbsp;Create&nbsp;a&nbsp;local&nbsp;stream<br/>rtc.localStream&nbsp;=&nbsp;AgoraRTC.createStream({<br/>&nbsp;&nbsp;streamID:&nbsp;rtc.params.uid,<br/>&nbsp;&nbsp;audio:&nbsp;true,<br/>&nbsp;&nbsp;video:&nbsp;true,<br/>&nbsp;&nbsp;screen:&nbsp;false,<br/>})<br/></code></pre><ol start="2"><li>调用 Stream.init 方法初始化创建的流。</li></ol><pre><code>//&nbsp;Initialize&nbsp;the&nbsp;local&nbsp;stream<br/>rtc.localStream.init(function&nbsp;()&nbsp;{<br/>&nbsp;&nbsp;console.log(&quot;init&nbsp;local&nbsp;stream&nbsp;success&quot;);<br/>},&nbsp;function&nbsp;(err)&nbsp;{<br/>&nbsp;&nbsp;console.error(&quot;init&nbsp;local&nbsp;stream&nbsp;failed&nbsp;&quot;,&nbsp;err);<br/>})<br/></code></pre><p>在初始化流时,浏览器会跳出弹窗要求摄像头和麦克风权限,请确保授权。<br/>3. 在 Stream.init 的 onSuccess 回调中调用 Client.publish 方法,发布本地流。</p><pre><code>//&nbsp;Publish&nbsp;the&nbsp;local&nbsp;stream<br/>rtc.client.publish(rtc.localStream,&nbsp;function&nbsp;(err)&nbsp;{<br/>&nbsp;&nbsp;console.log(&quot;publish&nbsp;failed&quot;);<br/>&nbsp;&nbsp;console.error(err);<br/>})<br/></code></pre><h2>订阅远端流</h2><p>当远端流加入频道时,会触发 stream-added 事件,我们需要通过 Client.on 监听该事件并在回调中订阅新加入的远端流。<br/>我们建议在创建客户端对象之后立即监听事件。</p><ol><li>监听 “stream-added” 事件,当有远端流加入时订阅该流。</li></ol><pre><code>rtc.client.on(&quot;stream-added&quot;,&nbsp;function&nbsp;(evt)&nbsp;{<br/>&nbsp;&nbsp;var&nbsp;remoteStream&nbsp;=&nbsp;evt.stream;<br/>&nbsp;&nbsp;var&nbsp;id&nbsp;=&nbsp;remoteStream.getId();<br/>&nbsp;&nbsp;if&nbsp;(id&nbsp;!==&nbsp;rtc.params.uid)&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;rtc.client.subscribe(remoteStream,&nbsp;function&nbsp;(err)&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(&quot;stream&nbsp;subscribe&nbsp;failed&quot;,&nbsp;err);<br/>&nbsp;&nbsp;&nbsp;&nbsp;})<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;console.log('stream-added&nbsp;remote-uid:&nbsp;',&nbsp;id);<br/>});<br/></code></pre><ol start="2"><li>监听 “stream-subscribed” 事件,订阅成功后播放远端流。</li></ol><pre><code>rtc.client.on(&quot;stream-subscribed&quot;,&nbsp;function&nbsp;(evt)&nbsp;{<br/>&nbsp;&nbsp;var&nbsp;remoteStream&nbsp;=&nbsp;evt.stream;<br/>&nbsp;&nbsp;var&nbsp;id&nbsp;=&nbsp;remoteStream.getId();<br/>&nbsp;&nbsp;//&nbsp;Add&nbsp;a&nbsp;view&nbsp;for&nbsp;the&nbsp;remote&nbsp;stream.<br/>&nbsp;&nbsp;addView(id);<br/>&nbsp;&nbsp;//&nbsp;Play&nbsp;the&nbsp;remote&nbsp;stream.<br/>&nbsp;&nbsp;remoteStream.play(&quot;remote_video_&quot;&nbsp;+&nbsp;id);<br/>&nbsp;&nbsp;console.log('stream-subscribed&nbsp;remote-uid:&nbsp;',&nbsp;id);<br/>})<br/></code></pre><p>受浏览器策略影响,在 Chrome 70+ 和 Safari 浏览器上,Stream.play 方法必须由用户手势触发,详情请参考 Autoplay Policy Changes。<br/>3. 监听 “stream-removed” 事件,当远端流被移除时(例如远端用户调用了 Stream.unpublish), 停止播放该流并移除它的画面。</p><pre><code>rtc.client.on(&quot;stream-removed&quot;,&nbsp;function&nbsp;(evt)&nbsp;{<br/>&nbsp;&nbsp;var&nbsp;remoteStream&nbsp;=&nbsp;evt.stream;<br/>&nbsp;&nbsp;var&nbsp;id&nbsp;=&nbsp;remoteStream.getId();<br/>&nbsp;&nbsp;//&nbsp;Stop&nbsp;playing&nbsp;the&nbsp;remote&nbsp;stream.<br/>&nbsp;&nbsp;remoteStream.stop(&quot;remote_video_&quot;&nbsp;+&nbsp;id);<br/>&nbsp;&nbsp;//&nbsp;Remove&nbsp;the&nbsp;view&nbsp;of&nbsp;the&nbsp;remote&nbsp;stream.<br/>&nbsp;&nbsp;removeView(id);<br/>&nbsp;&nbsp;console.log('stream-removed&nbsp;remote-uid:&nbsp;',&nbsp;id);<br/>})<br/></code></pre><p>我们建议在创建客户端对象之后立即监听事件。<br/>你需要自己实现 addView 和 removeView 的功能,可以参考我们的示例项目:<a href="http://dwz.date/uwr">http://dwz.date/uwr</a></p><h2>离开频道</h2><p>调用 Client.leave 方法离开频道。</p><pre><code>//&nbsp;Leave&nbsp;the&nbsp;channel<br/>rtc.client.leave(function&nbsp;()&nbsp;{<br/>&nbsp;&nbsp;//&nbsp;Stop&nbsp;playing&nbsp;the&nbsp;local&nbsp;stream<br/>&nbsp;&nbsp;rtc.localStream.stop();<br/>&nbsp;&nbsp;//&nbsp;Close&nbsp;the&nbsp;local&nbsp;stream<br/>&nbsp;&nbsp;rtc.localStream.close();<br/>&nbsp;&nbsp;//&nbsp;Stop&nbsp;playing&nbsp;the&nbsp;remote&nbsp;streams&nbsp;and&nbsp;remove&nbsp;the&nbsp;views<br/>&nbsp;&nbsp;while&nbsp;(rtc.remoteStreams.length&nbsp;&gt;&nbsp;0)&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;stream&nbsp;=&nbsp;rtc.remoteStreams.shift();<br/>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;id&nbsp;=&nbsp;stream.getId();<br/>&nbsp;&nbsp;&nbsp;&nbsp;stream.stop();<br/>&nbsp;&nbsp;&nbsp;&nbsp;removeView(id);<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;console.log(&quot;client&nbsp;leaves&nbsp;channel&nbsp;success&quot;);<br/>},&nbsp;function&nbsp;(err)&nbsp;{<br/>&nbsp;&nbsp;console.log(&quot;channel&nbsp;leave&nbsp;failed&quot;);<br/>&nbsp;&nbsp;console.error(err);<br/>})<br/></code></pre><h2>运行你的 app</h2><p>接下来,以我们的示例项目为例说明如何运行和测试你的 web app。<br/>我们建议在本地 Web 服务器上测试你的 app。这里我们用 npm 的 live-server 设置一个本地 服务器。<br/>在本地服务器(localhost)运行 web app 仅作为测试用途。部署生产环境时,请确保使用 HTTPS 协议。</p><ol><li>安装 live-server。</li></ol><pre><code>npm&nbsp;i&nbsp;live-server&nbsp;-g<br/></code></pre><ol start="2"><li><p>在命令行中进入你的项目所在的目录。对于我们的示例项目,该目录位于 /Basic-Video-Call/One-to-One-Video/Agora-Web-Tutorial-1to1。</p></li><li><p>运行 app。</p></li></ol><pre><code>live-server&nbsp;.<br/></code></pre><p>现在你的浏览器应该会自动打开你的 web app 页面。<br/>4. 输入你的 App ID,频道名,token,点击 JOIN 开始通话。<br/>你可能需要给浏览器摄像头和麦克风权限。如果在创建本地流时打开了视频,你现在应该可以看到自己的视频画面。<br/>5. 在浏览器中打开另一个页面,输入相同的 URL 地址。点击 JOIN 按钮。现在你应该可以看到两个视频画面。<br/>如果页面没有正常工作,可以打开浏览器的控制台查看错误信息进行排查。常见的错误信息包括:</p><ul><li>INVALID_VENDOR_KEY:App ID 错误,检查你填写的 App ID。<br/>*ERR_DYNAMIC_USE_STATIC_KE:你的 Agora 项目启用了 App 证书,需要在加入频道时填写 Token。<br/>*Media access:NotFoundError:检查你的摄像头和麦克风是否正常工作。<br/>*MEDIA_NOT_SUPPORT:请使用 HTTPS 协议 或者 localhost。<br/>注:Agora Web SDK 不支持在浏览器上模拟移动设备调试。</li></ul><p><strong>本文转载自声网 Agora 公众号。</strong></p><p><strong>原文链接:</strong><a href="https://mp.weixin.qq.com/s/9l-6iYWBE4EJaZwHM6_oBQ">https://mp.weixin.qq.com/s/9l-6iYWBE4EJaZwHM6_oBQ</a></p>


2020-02-25 15:17494

评论

发布
暂无评论
发现更多内容

架构师训练营第 06 周—— 练习

李伟

极客大学架构师训练营

[架构师训练营]Week03 - 作业

谭方敏

Java这么优秀,我当然要深入啦

程序员小跃

Java Lambda

上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB

Kerwin

Java MySQL ES 深度分页

职业发展的迷茫与困境:你真的了解职级体系吗?

伴鱼技术团队

程序员 技术管理 人才培养 职业成长 技术人生

架构师第六周作业及总结

傻傻的帅

CAP的原理

满山李子

从面试到入职到离职,我在B站工作的30天时光!!!

诸葛小猿

面试 B站 哔哩哔哩 收钱吧

架构师训练营第 06 周——总结

李伟

极客大学架构师训练营

By Experience的三个层次 -- 领域驱动设计的经验之谈

冯文辉

架构 领域驱动设计 DDD 架构设计

Redis进阶篇二——持久化

多选参数

redis redis6.0.0 redis集群 redis持久化

【week06】作业

chengjing

redis系列之——数据类型bitmaps:今天你签到了吗?

诸葛小猿

redis bitmaps bloomfilter

极客时间架构师训练营 - week6 - 作业 2

jjn0703

极客大学架构师训练营

为了保存VuePress构建的网站为PDF,我竟然。。。

Leetao

Python python 爬虫 PDF vuepress pdfkit

并发业务中,线程安全与否很重要,来看看你懂多少?

Java小咖秀

Java 多线程与高并发

Week 6 作业

Shawn

架构师训练营第六周学习总结

fenix

极客大学架构师训练营

架构师训练营第六章作业

叮叮董董

架构感悟 6- 平衡之美

旭东(Frank)

朱嘉明:区块链对深入改革的意义何在?

CECBC

区块链技术 政策扶持 块链与经济 区块链功能 产业数字化

架构师训练营(6周)

Hanson

week6.课后作业

个人练习生niki👍

极客大学架构师训练营

JVM详解之:java class文件的密码本

程序那些事

Java JVM class GC 密码

架构师训练营 Week 06 作业

Wancho

400GE燎原前夜,智能IP网络的核心路由器巅峰际会

脑极体

架构师训练营作业(6周)

Hanson

架构师训练营第六章总结

叮叮董董

黑鹰坠落

escray

负载均衡

满山李子

rdd序列化

InfoQ_6cf02607664f

基于 Agora Web SDK 实现一对一视频通话_新基建_声网_InfoQ精选文章