1

我正在使用@opentok/client为简单的多用户视频聊天构建 Angular6 应用程序。

我想做一个“聚光灯”(例如,全屏用户当前在会话中说话)功能hark.js用于语音检测。

问题是这个库需要源MediaStream来处理音频并发出我要捕获和处理的事件。

我想MediaStream从 OpenTok 的订阅者类中获取,但是如何做到这一点却无处可寻,但由于它基于常见的 WebRTC,它应该是可行的。

有什么线索吗?

示例代码:

 this.opentokService.initSession().then((session: OT.Session) => {
  this.session = session;
  this.session.on('streamCreated', (event) => {
    this.streams.push(event.stream); //creates the subscribers elements
    var speechEvents = hark(event.stream, {}); //raises error, how to get a proper MediaStream here?
  });
4

2 回答 2

4

你是对的,因为 OpenTok 只是常见的 WebRTC,你可以从订阅者的底层视频元素中获取 MediaStream,如下所示:

const mediaStream = subscriber.element.querySelector('video').srcObject;

这将适用于最新版本的 Chrome、Firefox、Safari 和 Edge。它在 Internet Explorer 中不起作用,因为它使用插件并且无论如何都没有 MediaStream 对象。

我还想指出,订阅者本身具有可用于实现相同目的的 audioLevelUpdated 事件。该事件为您提供介于 0 和 1 之间的 audioLevel。文档中有一个很好的示例说明如何将其转换为 dB 范围https://tokbox.com/developer/sdks/js/reference/Subscriber.html#events

我不确定hark.js 是否进行了一些处理以确保它是语音,如果是这样,它可能仍然可以更好地工作。音频电平事件仅基于噪声,无论它是否是语音。

于 2018-11-09T00:31:01.730 回答
0

您可以像这样访问它:

const mediaStream = subscriber._.webRtcStream()
于 2018-11-30T23:29:44.827 回答