从Opentok.js订户获取MediaStream

时间:2018-11-08 16:33:29

标签: angular webrtc opentok mediastream

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

我想使用hark.js进行“聚光灯”(例如,正在会话中正在讲话的用户全屏显示)功能进行语音检测。

问题在于该库需要源MediaStream来处理音频并发出我将捕获并处理的事件。

我想从OpenTok的订户类中获取MediaStream,但是如何做到这一点却找不到,但是由于它基于通用的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?
  });

2 个答案:

答案 0 :(得分:3)

您是对的,因为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是否进行了某些处理以确保它是语音,如果这样的话,它仍然可以更好地工作。音频级别事件仅基于噪声,而不管它是否是语音。

答案 1 :(得分:0)

您可以这样访问它:

const mediaStream = subscriber._.webRtcStream()