经过艰苦努力,我终于成功地建立了一个 Node C++ 插件,并将 web 平台标准的 MediaStream
对象放入其中一个 C++ 方法中。为了在不同的 V8 和 Node.js 版本之间保持兼容性,我正在使用 Native Abstractions for Node.js (nan):
addon.cc
NAN_METHOD(SetStream)
{
Nan::HandleScope scope;
v8::Local<v8::Object> mediaStream = info[0]->ToObject();
}
插件.js
setStream(new MediaStream());
就我所知,这段代码是正确的(即它不会立即摧毁渲染进程),并且我可以验证MediaStream
对象的存在,例如通过从C++方法返回其构造函数名称:
addon.cc
info.GetReturnValue().Set(mediaStream->GetConstructorName());
当通过setStream
从JavaScript调用时,它将返回字符串MediaStream
,因此该对象肯定存在。我也可以返回mediaStream
对象本身,一切都将正常工作,所以这确实是我需要的对象。
那么,我如何从C++中读取此MediaStream
对象的音频数据(即音频样本)? 顺便说一下,实际的数据读取(和处理)将在一个单独的std :: thread
中完成。
Bounty Update
我明白如果我编译Electron和/或Chromium,则可能会更容易/可能,但我宁愿不涉足维护地狱。
我想知道是否有可能在不这样做的情况下完成,就我所知,我相信我需要以下两件事才能完成:
- 相关的头文件,我相信blink public应该足够。
- 一个chromium / blink库文件(?),类似于node.dylib文件,用于解析外部符号
此外,正如我所说,我相信我可以编译chromium / blink,然后我将拥有这个lib文件,但是这将是Electron的维护地狱。考虑到这一点,我认为这个问题最终归结为C ++链接问题。是否有其他方法可以做到我要寻找的内容?
Edit
ScriptProcessorNode在我的情况下不是选项,因为它的性能使其在生产中几乎无法使用。这将需要在ui / main线程上处理音频样本,这绝对是疯狂的。
Edit 2
AudioWorklets在Electron中已经可用了一段时间,与ScriptProcessorNode(或更糟的AnalyzerNode)不同,它是低延迟的,并且非常可靠,可用于真正的C ++支持音频处理,即使在实时环境中也是如此。
如果有人想编写基于AudioWorklet的答案,我将非常乐意接受,但请注意:这是一个非常高级的领域,是一个非常深的兔子洞,在甚至简单的通用通过原型之前有无数的障碍要克服(特别是因为当前在Electron中,需要原子同步,缓冲区跨线程音频处理才能完成,因为https://github.com/electron/electron/issues/22503,尽管将本机C ++附加组件引入一个音频渲染器线程,更不用说同时在多个线程中,可能同样具有挑战性)。