经过流血和眼泪,我终于设法建立了一个Node C ++附加组件,并将一个Web平台标准MediaStream
对象永久地推入其C ++方法之一。为了在不同的V8和Node.js版本之间实现兼容性,我将原生抽象用于Node.js(nan):
插件
NAN_METHOD(SetStream)
{
Nan::HandleScope scope;
v8::Local<v8::Object> mediaStream = info[0]->ToObject();
}
addon.js
setStream(new MediaStream());
对于它的价值,它可以正常工作(即,它不会消除渲染器进程的视线),并且我可以验证MediaStream
对象的存在,例如,通过从C ++方法返回其构造函数名称:
插件
info.GetReturnValue().Set(mediaStream->GetConstructorName());
当从JavaScript通过调用时setStream
,这将返回字符串MediaStream
,因此该对象肯定在那里。我还可以返回mediaStream
对象本身,并且一切都会正常运行,因此确实是我需要的对象。
那么,我将如何MediaStream
在C ++中从此对象读取音频数据(即音频样本)?附带说明一下,实际的数据读取(和处理)将在单独的中完成std::thread
。
赏金更新
我知道,如果我自己编译Electron和/或Chromium,这样做会更容易/可行,但我不想参与该维护工作。
我想知道是否可以不这样做,就我的研究而言,我深信我需要两件事来完成此任务:
- 相关的头文件,我相信会公开应该足够了
- 铬/闪烁库文件(?),用于解析外部符号,类似于node.dylib文件
而且,正如我所说,我相信自己可以自己编译Chrome / blink,然后获得这个lib文件,但这将为Electron带来麻烦。考虑到这一点,我相信这个问题最终可以归结为C ++链接问题。还有其他方法可以做我想要的吗?
编辑
在我的案例中,ScriptProcessorNode不是一个选择,因为它的性能使其在生产中几乎无法使用。这将需要在ui / main线程上处理音频样本,这绝对是疯狂的。
编辑2
AudioWorklets在Electron中已经存在了一段时间,与ScriptProcessorNode(或更糟糕的是,AnalyzerNode)不同,具有低延迟并且对于实时C ++支持的音频处理来说非常可靠。
在我的应用程序(AudioNodes)中,我已经为实验性的VST插件主机原型(很可能是第一个Web Audio API)实现了这种方法。
如果有人想继续写一个基于AudioWorklet的答案,我会很乐意接受,但要提防:这是一个非常先进的领域,而且洞洞很深,即使在非常简单,通用的应用程序之前也要克服无数障碍传递原型(特别是因为当前在Electron中需要原子同步的缓冲跨线程音频处理才能实现此目的,因为https://github.com/electron/electron/issues/22503-尽管获取本机将C ++插件添加到一个音频渲染器线程(更不用说同时使用多个线程)可能同样具有挑战性。