解决Twilio视频应用程序的故障

162 阅读11分钟

本博客是Alberto Gonzalez Trastoy发表的一篇文章的翻译。

在一个以毫秒为单位的世界里,低延迟的WebRTC是实时通信的首选协议。万维网联盟(W3C)和互联网工程任务组(IETF)宣布,今年WebRTC协议将被无数的用户用来传送视频和直播内容,控制远程操作的车辆和其他各种对象。今年,万维网联盟(W3C)和互联网工程任务组(IETF)宣布,WebRTC终于成为一个官方标准。然而,WebRTC仍在发展过程中。

WebRTC正在不断改进。浏览器-设备整合(融合)等问题正在得到解决,不同的浏览器和设备将有可能执行相同的任务并与相同类型的内容互动。开发人员喜欢使用Twilio的可编程视频,因为WebRTC易于使用。然而,浏览器和操作系统之间的差异仍然可能成为一个问题。

由于其他各种原因,在生产环境中构建WebRTC应用程序涉及大量的测试和故障排除。在这篇文章中,我们将重点讨论故障排除。除了提供方法和工具来帮助你排除任何视频应用的故障外,我们还将介绍一些重要的概念,这些概念是你在使用Twilio视频API排除发布应用的故障时需要了解的。

排除一个应用程序的故障的第一步是确定问题。

如何识别Twilio视频应用中的问题

下图显示了一个使用Twilio的基本媒体发布初始化。

twilio media connection - initialization

显示与Twilio初始化媒体连接的主要步骤的图表

常见的问题,如网络连接问题、糟糕的代码和缺乏负载平衡,会影响许多应用程序。然而,使用Twilio视频的应用程序有一个额外的服务,它不仅可以返回值,而且还可以在用户之间捕获、处理和传递媒体。因此,仅仅检查Twilio服务器是否工作是不够的。你还需要确保用户的硬件工作正常,他们使用的是支持的浏览器,他们的网络支持所需的协议,并且支持用户和Twilio服务器之间的最小带宽。对于生产环境中的应用

对于生产中的应用,第一个可以用来诊断问题的工具是视频日志分析工具,可以在Twilio控制台找到。如果你知道有关视频通话的Room SID,你可以得到很多关于通话中发生的问题的数据。下面的图片显示了最新的视频室列表。

twilio console video log analyzer

视频日志分析器显示最近创建的房间列表

如果你点击某个视频室的房间SID,你会被带到一个有更多细节的页面,如下图所示。

video log analyzer - details

视频日志分析器中显示的视频室的细节。你可以看到诸如房间创建的日期和时间、参与者、发布的流、参与者的连接被终止的原因、使用的编解码器和媒体的区域等信息。

这是一个很好的工具,可以看到你需要哪些信息进行进一步调查。你可能会发现一些模式,如使用特定操作系统的用户遇到相同类型的错误代码,或某一地区的参与者比其他人更频繁地被断开连接。一旦你对发生的事情有了线索,你就可以想出一个解决方案。

关于视频日志分析器的更多信息,请见本文件

你还可以使用RTC诊断SDK来检测音频/视频输入/输出问题和媒体连接状态。这并不包括在Twilio视频SDK中,但很容易使用。你所要做的就是决定你要捕捉什么信息并处理相应的事件。

例如,要捕获要接收的最大比特率,使用以下代码

import { testMediaConnectionBitrate } from '@twilio/rtc-diagnostics';

const mediaConnectionBitrateTest = testMediaConnectionBitrate({
 iceServers: [{
   credential: 'bar',
   username: 'foo',
   urls: 'turn:global.turn.twilio.com:3478?transport=udp',
 }],
});

mediaConnectionBitrateTest.on('bitrate', (bitrate) => {
 console.log(bitrate);
});

另一个排除Twilio视频室故障的有用工具是Preflight API(目前处于测试阶段)。

日文版作者的说明:该功能处于测试阶段,不会包含在正式版本的发布中。如果你想试试这个功能,请使用这个版本

这个诊断API可用于在进入视频室之前检测连接和媒体质量问题,或作为故障排除页面的一部分。首先,它检查与Twilio云的WebSocket连接,然后检查媒体路径。该API自动发布媒体,在一个循环中订阅自己,并在测试结束后生成一份报告。为了了解如何使用预检API,让我们看一下下面的例子。

const Video = require('twilio-video');
const tempRoomName = 'test-room-' + Date.now();
const publisherToken = getAccessToken('alice', tempRoomName);
const subscriberToken = getAccessToken('bob', tempRoomName);

为了了解如何使用Preflight API,让我们看一下下面的例子:在上面的这部分代码中,我们已经创建了一个测试室,并指定了一个发布者和一个订阅者。接下来,在下面的代码中,我们调用testPreflight()方法。在这里,你可以监听completed事件并传入报告对象。

const preflightTest = Video.testPreflight(publisherToken, subscriberToken);

preflightTest.on('completed', function(report) {
  console.log("Test completed in " + report.testTiming.duration + " milliseconds.");
  console.log(" It took " + report.networkTiming.connect.duration + " milliseconds to connect");
  console.log(" It took " + report.networkTiming.media.duration + " milliseconds to receive media");
  // network score is available only for group rooms.
  console.log(" Your network score was: " + report.stats.networkQuality);
});

此外,如果你能在本地重现该问题并使用Chrome浏览器,你可以在搜索栏中输入chrome://webrtc-internals。你会看到关于每个呼叫的阶段、编解码器、比特率和其他正在进行的呼叫的有用的WebRTC信息;如果你使用的是Firefox,你可以通过访问about:webrtc,获得同等的信息。

故障处理的数据收集工具

你可以使用Twilio视频日志分析器将信息可视化,或者直接在控制台显示信息,但你可能无法访问其他用户的日志。或者你可能需要更详细的信息来帮助你排除故障或监测问题。在这些情况下,你将需要捕捉信息,并将其存储在以下位置之一

twilio-video.js v2.10.0及以后的版本中,你可以通过使用loglevel模块拦截日志。这样就可以对日志进行实时处理。处理包括但不限于验证日志数据和将日志发送到你自己的服务器。例如,你可以拦截记录器信息并监听信令事件,如下图所示。

const { Logger, connect } = require('twilio-video');
const token = getAccessToken();

const logger = Logger.getLogger('twilio-video');

// Listen for logs
let originalFactory = logger.methodFactory;
logger.methodFactory = function (methodName, level, loggerName) {
  let method = originalFactory(methodName, level, loggerName);

  return function (datetime, logLevel, component, message, data) {
    method(datetime, logLevel, component, message, data);
    if (message === 'event' && data.group === 'signaling') {
      if (data.name === 'waiting') {
        console.warn('Twilio\'s signaling server is busy, so we wait a little while before trying again.');
      } else if (data.name === 'open') {
        console.log('Connected to Twilio\'s signaling server, joining the Room now.');
      } else if (data.name === 'closed') {
        if (data.level === 'error') {
          const { payload: { reason } } = data;
          console.error('Connection to Twilio\'s signaling server abruptly closed:', data.reason);
        } else {
          console.log('Connection to Twilio\'s signaling server closed.');
        }
      }
    }
  };
};

正如你在上面的代码中看到的,我们正在过滤从信号组(data.group === 'signaling')收到的事件消息。在此之后,我们需要将日志级别设置为info(debug),以便拦截信令事件。

logger.setLevel('info');
connect(token, {
  name: 'aroom'
}).then(function(room) {
  room.on('participantConnected', function(participant) {
    console.log(participant.identity + ' has connected');
  });
}).catch(error => {
  console.log('Could not connect to the Room:', error.message);
});

另一个收集数据的有用工具是网络质量API。这个API监控视频室参与者的网络连接,并使用一种算法对连接质量进行评分,评分范围为 "0(网络故障)"到 "5(非常好)"。

例如,为了使用网络质量API跟踪呼叫质量,你可以定义一个网络质量口令并处理networkQualityLevelChanged事件。这在下面的代码中显示。 printNetworkQualityStats 是一个函数,它将定期或根据需要把这些统计数据发布到日志系统。

const Video = require('twilio-video');
const token = getAccessToken();

Video.connect(token, {
  name: 'my-room',
  audio: { name: 'microphone' },
  video: { name: 'camera' },
  networkQuality: {
    local: 1, // LocalParticipant's Network Quality verbosity [1 - 3]
    remote: 2 // RemoteParticipants' Network Quality verbosity [0 - 3]
  }
}).then(function(room) {
  // Print changes to Network Quality Level and statistics
  room.localparticipant.on('networkQualityLevelChanged', printNetworkQualityStats);
});

数据可视化和存储

到目前为止描述的调试工具和API需要与事件记录/可视化系统结合使用。数据可以直接发送到JSON或文本文件中,但你也可以设置一个事件调试的webhook或将日志发送到ELK堆栈系统(开源)或其他第三方服务。

无论你最终选择哪种服务,确保你记录并保存对排除Twilio视频应用故障最有用的信息。

你应该保存的第一条信息是Twilio的任何错误或警告。这通常包括在参与者首次连接到呼叫时、呼叫开始时或新参与者加入时出现的问题。此外,来自RTC诊断SDK视频SDK预检API网络质量API的相关数据在监测参与者的体验或保存质量指标供以后审查时也很有用。

记录和存储用户的浏览器、浏览器版本、操作系统和位置也是可取的。如果这些信息与特定的Twilio错误、警告或其他质量指标相关,它可以帮助我们追踪和重现bug。

网络和带宽要求

视频应用实时交换媒体,因此比其他类型的应用更依赖网络。下图1显示了Twilio提供的语音和视频的官方带宽要求表

带宽(上行链路/下行链路

32~100kbps(仅语音

> 150kbps(仅视频

延迟(RTT

< 200ms

抖动

< 30ms

数据包丢失

< 3

图1:Twilio带宽需求表

如果带宽低于这一要求,你必须通知用户。例如,你可以在页面顶部显示一个模态,提醒用户由于带宽低而关闭摄像头,或者提供通过电话拨号的选项。

图2显示了进行视频通话的最低用户要求。

视频室的类型

最小所需带宽(客户端

多达9名参与者,低分辨率VP8视频(240x180)+高清音频

~2 Mbps

多达9名参与者,标清VP8视频(640x480)+高清音频

~4 Mbps

多达9名参与者,高清VP8视频(1280x720)+高清音频

~6 Mbps

图2.视频的带宽要求假定用户以30fps的速度接收所有参与者(除自己外)的音频和视频。这一带宽要求取决于编解码器、分辨率和帧率。

由于WebRTC,视频通话可以适应网络条件,所以你只需要确保达到最低的低分辨率视频质量。如果用户无法满足最低的视频要求,就有必要切换到纯音频模式。

除了通常用于HTTP请求的80和443端口的标准TCP通信外,WebRTC还使用各种端口和协议。因此,建议检查你的网络基础设施,以确保你的服务器能够向公共互联网发送TCP和UDP出站流量,并接收客户的入站请求。该应用程序应该向Twilio的媒体和信号服务器发起请求,并从这些服务器接收流量。

关于Twilio视频应用故障排除的更多信息

现在你已经熟悉了一个好的故障排除工具,现在是时候把它用在你自己的视频应用中了。

我们已经把你需要的最低限度的检查放在一起,以排除故障。

  1. 使用上述诊断工具测试连接并确定任何其他问题
  2. 收集和存储日志,用于监测和未来参考
  3. 确保满足带宽要求
  4. 允许应用程序连接到Twilio的媒体服务器/信号服务器
  5. 审查Twilio视频的建议和最佳实践,以确保为用户提供最佳体验

Twilio可编程视频的技术正在不断改进,使开发人员能够以新的方式分析和解决视频通话的问题。如果你想了解更多关于故障排除的信息,请查看视频日志分析器REST API。如果你对一般的调试感兴趣,请查看我们对调试Twilio应用程序的一般建议。关于可编程视频的最佳做法的更多信息,请参考Twilio可编程视频文档

Alberto Gonzalez Trastoy是WebRTC.ventures的一名高级工程师。他在通信工程领域工作,对技术有着浓厚的兴趣,曾参与过许多基于VoIP/WebRTC的大小型公司的项目。他所参与的项目包括网真远程控制、游戏直播、视频呼叫中心、语音分析和其他各种实时应用。

阿尔贝托的推特账户是_@lbertogon_阿尔贝托的Twitter账户是@lbertogon。