Joh*_*isz 69 javascript c++ v8 blink electron
在流血和流泪之后,我终于设法建立了一个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();
}
Run Code Online (Sandbox Code Playgroud)
addon.js
setStream(new MediaStream());
Run Code Online (Sandbox Code Playgroud)
对于它的价值,它可以正常工作(即它不会立即删除渲染器进程),并且我可以验证MediaStream对象的存在,例如通过从C++方法返回其构造函数名称:
addon.cc
info.GetReturnValue().Set(mediaStream->GetConstructorName());
Run Code Online (Sandbox Code Playgroud)
当从JavaScript调用时setStream,这将返回字符串MediaStream,因此对象肯定存在.我也可以返回mediaStream对象本身,一切都会正常工作,所以它确实是我需要的对象.
那么,我如何MediaStream在C++中从这个对象中读取音频数据(即音频样本)?作为旁注,实际数据读取(和处理)将在单独的情况下完成std::thread.
我明白如果我自己编译Electron和/或Chromium,这将更容易/可能,但我宁愿不参与维护地狱.
我想知道如果没有这样做是否可能,并且就我的研究而言,我确信我需要做两件事:
另外,正如我所说,我相信我可以自己编译chrome/blink然后我会有这个lib文件,但这对于Electron来说是一个维护地狱.考虑到这一点,我相信这个问题最终归结为C++链接问题.有什么其他方法可以做我正在寻找的东西吗?
在我的情况下,ScriptProcessorNode不是一个选项,因为它的性能使它在生产中几乎无法使用.这将需要在ui /主线程上处理音频样本,这绝对是疯狂的.
MediaStream 标头是 Blink渲染器模块的一部分,对我来说如何从 nan 插件检索它并不明显。
因此,让我们看看您拥有的内容,即v8::Object。我相信 v8::Object 公开了您需要的所有功能,它具有:
除非您确实需要严格定义的接口,否则为什么不完全避免该问题并仅使用已有的动态类型呢?
为了专门获取音频数据,您需要在 v8::Object 上调用getAudioTracks(),它可能看起来像这样?
注意:我认为你不需要上下文,v8 似乎对它为空感到满意:v8/src/api/api.cc
应该看起来像这样,加上 v8 进出类型的一些调整。
v8::MaybeLocal<v8::Value> get_audio_tracks = mediaStream->Get("getAudioTracks");
// Maybe needs to be v8::Object or array?
if (!get_audio_tracks.IsEmpty()) {
v8::Local<v8::Value> audio_tracks = get_audio_tracks.ToLocalChecked()();
}
Run Code Online (Sandbox Code Playgroud)