本文会详细介绍如何建立一个简单的项目并使用 Agora Web SDK 实现基础的一对一视频通话。
由于浏览器的安全策略对除 127.0.0.1 以外的 HTTP 地址作了限制,Agora Web SDK 仅支持 HTTPS 协议或者 http://localhost(http://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
开发条件
安装一款 Agora Web SDK 支持的浏览器,如下表所示:
获得一个有效的 Agora 账号。
注:如果你的网络环境部署了防火墙,请根据声网文档中心的「应用企业防火墙限制」打开相关端口。
设置开发环境
你需要准备一个自己的项目并且将 Agora Web SDK 集成到其中。
创建 Web 项目
如果你已经有一个 Web 项目了,跳过本小节,直接阅读集成 SDK。
我们提供的示例代码使用了一些第三方的库文件来实现页面的样式和布局,你可以访问本文开篇的 Github 地址,在文件夹「vendor」中获得以下文件,或者使用其他方式实现。
common.css
jquery.min.js
materialize.min.js
以下为示例:
这个项目只需要用到一个 HTML 文件。
新建一个 HTML 文件。这里我们将文件命名为 index.html(以下简称项目文件)。
用一个代码编辑器(例如 VS Code)打开该文件。
复制以下代码,粘贴到项目文件中。
该步骤会为你的项目创建前端页面的 UI。这里我们直接用了 Agora 示例项目中的代码,你也可以自定义你的 UI。
集成 SDK
选择如下任意一种方法获取 Agora Web SDK:
方法 一、 使用 npm 获取 SDK
运行安装命令
2.在你的项目的 Javascript 代码中添加一行:
方法 二、 使用 CDN 方法获取 SDK
该方法无需下载安装包。在项目文件中,将以下代码添加到上一行:</p><pre><code><script src="https://cdn.agora.io/sdk/release/AgoraRTCSDK-3.0.0.js"></script><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>// rtc object<br/>var rtc = {<br/> client: null,<br/> joined: false,<br/> published: false,<br/> localStream: null,<br/> remoteStreams: [],<br/> params: {}<br/>};<br/><br/>// Options for joining a channel<br/>var option = {<br/> appID: "Your App ID",<br/> channel: "Channel name",<br/> uid: null,<br/> token: "Your token"<br/>}<br/></code></pre><h2>加入频道</h2><ol><li>加入频道前,我们需要先创建并初始化一个客户端对象。</li></ol><pre><code>// Create a client<br/>rtc.client = AgoraRTC.createClient({mode: "rtc", codec: "h264"});<br/><br/>// Initialize the client<br/>rtc.client.init(option.appID, function () {<br/> console.log("init success");<br/> }, (err) => {<br/> 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>// Join a channel<br/>rtc.client.join(option.token ? option.token : null, option.channel, option.uid ? +option.uid : null, function (uid) {<br/> console.log("join channel: " + option.channel + " success, uid: " + uid);<br/> rtc.params.uid = uid;<br/> }, function(err) {<br/> console.error("client join failed", 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>// Create a local stream<br/>rtc.localStream = AgoraRTC.createStream({<br/> streamID: rtc.params.uid,<br/> audio: true,<br/> video: true,<br/> screen: false,<br/>})<br/></code></pre><ol start="2"><li>调用 Stream.init 方法初始化创建的流。</li></ol><pre><code>// Initialize the local stream<br/>rtc.localStream.init(function () {<br/> console.log("init local stream success");<br/>}, function (err) {<br/> console.error("init local stream failed ", err);<br/>})<br/></code></pre><p>在初始化流时,浏览器会跳出弹窗要求摄像头和麦克风权限,请确保授权。<br/>3. 在 Stream.init 的 onSuccess 回调中调用 Client.publish 方法,发布本地流。</p><pre><code>// Publish the local stream<br/>rtc.client.publish(rtc.localStream, function (err) {<br/> console.log("publish failed");<br/> 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("stream-added", function (evt) {<br/> var remoteStream = evt.stream;<br/> var id = remoteStream.getId();<br/> if (id !== rtc.params.uid) {<br/> rtc.client.subscribe(remoteStream, function (err) {<br/> console.log("stream subscribe failed", err);<br/> })<br/> }<br/> console.log('stream-added remote-uid: ', id);<br/>});<br/></code></pre><ol start="2"><li>监听 “stream-subscribed” 事件,订阅成功后播放远端流。</li></ol><pre><code>rtc.client.on("stream-subscribed", function (evt) {<br/> var remoteStream = evt.stream;<br/> var id = remoteStream.getId();<br/> // Add a view for the remote stream.<br/> addView(id);<br/> // Play the remote stream.<br/> remoteStream.play("remote_video_" + id);<br/> console.log('stream-subscribed remote-uid: ', 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("stream-removed", function (evt) {<br/> var remoteStream = evt.stream;<br/> var id = remoteStream.getId();<br/> // Stop playing the remote stream.<br/> remoteStream.stop("remote_video_" + id);<br/> // Remove the view of the remote stream.<br/> removeView(id);<br/> console.log('stream-removed remote-uid: ', 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>// Leave the channel<br/>rtc.client.leave(function () {<br/> // Stop playing the local stream<br/> rtc.localStream.stop();<br/> // Close the local stream<br/> rtc.localStream.close();<br/> // Stop playing the remote streams and remove the views<br/> while (rtc.remoteStreams.length > 0) {<br/> var stream = rtc.remoteStreams.shift();<br/> var id = stream.getId();<br/> stream.stop();<br/> removeView(id);<br/> }<br/> console.log("client leaves channel success");<br/>}, function (err) {<br/> console.log("channel leave failed");<br/> 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 i live-server -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 .<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>
评论