我正在使用@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?
});
答案 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()