Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从';MediaStream&x27;C++;插件 汗水和眼泪之后,我终于成功地建立了一个节点C++ +的Adon,并把一个Web平台标准“代码> MistaReaMe//Cord>Objes”作为一个C++方法。为了兼容不同的V8和Node.js版本,我使用了:_Javascript_C++_Electron_V8_Blink - Fatal编程技术网

Javascript 如何从';MediaStream&x27;C++;插件 汗水和眼泪之后,我终于成功地建立了一个节点C++ +的Adon,并把一个Web平台标准“代码> MistaReaMe//Cord>Objes”作为一个C++方法。为了兼容不同的V8和Node.js版本,我使用了:

Javascript 如何从';MediaStream&x27;C++;插件 汗水和眼泪之后,我终于成功地建立了一个节点C++ +的Adon,并把一个Web平台标准“代码> MistaReaMe//Cord>Objes”作为一个C++方法。为了兼容不同的V8和Node.js版本,我使用了:,javascript,c++,electron,v8,blink,Javascript,C++,Electron,V8,Blink,addon.cc NAN_METHOD(SetStream) { Nan::HandleScope scope; v8::Local<v8::Object> mediaStream = info[0]->ToObject(); } info.GetReturnValue().Set(mediaStream->GetConstructorName()); 对于它的价值,它是正确的(即它不会抹去渲染器进程在视线中),并且我可以验证“代码>媒体纵横> 对象的

addon.cc

NAN_METHOD(SetStream)
{
    Nan::HandleScope scope;
    v8::Local<v8::Object> mediaStream = info[0]->ToObject();
}
info.GetReturnValue().Set(mediaStream->GetConstructorName());

对于它的价值,它是正确的(即它不会抹去渲染器进程在视线中),并且我可以验证“代码>媒体纵横> <代码>对象的存在,例如通过从C++方法返回它的构造函数名称:

addon.cc

NAN_METHOD(SetStream)
{
    Nan::HandleScope scope;
    v8::Local<v8::Object> mediaStream = info[0]->ToObject();
}
info.GetReturnValue().Set(mediaStream->GetConstructorName());
当通过
setStream
从JavaScript调用时,将返回字符串
MediaStream
,因此对象肯定在那里。我还可以返回
mediaStream
对象本身,一切都将正常工作,因此它确实是我需要的对象

< > >强> >我如何从C++中的“代码”> MistaReaMe//Cord>对象读取音频数据(即音频样本)?作为一个旁侧,实际数据读取(和处理)将在单独的<代码> STD::线程< /代码>中执行。
赏金更新 我知道,如果我自己编译Electron和/或Chromium,这会比较容易/可能,但我不想卷入维护的地狱

我想知道如果不这样做是否可能,就我的研究而言,我确信我需要两件事来完成这件事:

  • 相关的头文件,我认为应该足够了
  • chromium/blink库文件(?),用于解析外部符号,类似于node.dylib文件
  • 另外,正如我所说的,我相信我可以自己编译chromium/blink,然后我就有了这个lib文件,但这对Electron来说将是一个维护地狱。考虑到这一点,我相信这个问题最终归结为C++链接问题。有没有其他的方法来完成我想要的

    编辑 ScriptProcessorNode在我的例子中不是一个选项,因为它的性能使它在生产中几乎不可用。这将需要在ui/主线程上处理音频样本,这绝对是疯狂的

    编辑2 电子已经有一段时间了,它不像Script处理器节点(或者更糟,分析器节点),对于真正的C++支持的音频处理来说,即使是实时的,也具有很低的延迟,非常可靠。
    如果有人想继续写一个基于AudioWorklet的答案,我很乐意接受,但请注意:这是一个非常先进的领域,是一个非常深的兔子洞,甚至在一个非常简单、通用的穿越原型出现之前,就有无数的障碍要通过(尤其是因为目前在电子中,Atomics同步,缓冲的跨线程音频处理是需要的,因为尽管将本地C++的ADON变成一个音频渲染器线程,更不用说多个线程同时,可能同样具有挑战性)。.

    MediaStream头是Blink的一部分,我不清楚如何从nan插件中检索它

    因此,让我们来看看您拥有什么,即。我相信v8::Object公开了您需要的所有功能,它具有:

    • GetPropertyNames()
    • 获取(上下文、索引)
    • 设置(上下文、键、值)
    • Has(上下文、键)
    除非您真的需要一个严格定义的接口,为什么不完全避免这个问题,只使用您已经拥有的动态类型呢

    为了获得音频数据,您需要调用v8::对象,它可能看起来像这样

    注意:我认为您不需要上下文,v8似乎对它为空感到满意:

    应该看起来像这样,再加上一些按摩的类型和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()();
    }
    
    
    v8::MaybeLocal get_audio_tracks=mediaStream->get(“getAudioTracks”);
    //可能需要是v8::对象还是数组?
    如果(!get_audio_tracks.IsEmpty()){
    v8::Local audio_tracks=获取_audio_tracks.ToLocalChecked();
    }
    
    我不明白你的问题。但你可以检查这两个:…@nullqube我一直在检查WebRTC的这个任务,但它似乎是流原始的,未压缩的音频。如果可能的话,我可以简单地启动一个新的电子窗口进程,在那里流音频,在那个单独的窗口进程中进行基于ScriptProcessorNode的处理s、 但总是有大量有损压缩硬编码到WebRTC,以及非常高的延迟。这有帮助吗?您是否尝试在JavaScript端使用
    WebWorker
    将您的工作转移到“后台线程”中如果你能知道你的电子或铬版本的眨眼引擎版本,那么你可以在媒体流中添加一个音频路径C++的源。我目前还没有测试过,但是几个月后我会。并发布更详细的答案:)