gpt4 book ai didi

javascript - 如何从 C++ 插件中的 'MediaStream' 对象读取音频数据

转载 作者:行者123 更新时间:2023-12-01 19:18:28 24 4
gpt4 key购买 nike

在流尽血泪之后,我终于成功地设置了一个 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();
}

addon.js

setStream(new MediaStream());

就其值(value)而言,它工作正常(即它不会消除可见的渲染器进程),并且我可以验证 MediaStream 对象的存在,例如通过从 C++ 方法返回其构造函数名称:

addon.cc

info.GetReturnValue().Set(mediaStream->GetConstructorName());

当通过 setStream 从 JavaScript 调用时,这将返回字符串 MediaStream,因此该对象肯定存在。我还可以返回 mediaStream 对象本身,一切都会正常工作,所以它确实是我需要的对象。

那么,我如何从 C++ 中的这个 MediaStream 对象中读取音频数据(即音频样本)? 作为旁注,实际读取的数据(和处理)将在单独的 std::thread 中完成。

<小时/>

赏金更新

我知道如果我自己编译 Electron 和/或 Chromium,这会更容易/可能,但我宁愿不参与维护 hell 。

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

  1. 相关头文件,我相信blink public应该足够了
  2. 一个 chromium/blink 库文件(?),用于解析外部符号,类似于 node.dylib 文件

另外,正如我所说,我相信我可以自己编译 chromium/blink,然后我就会得到这个 lib 文件,但这对 Electron 来说将是一个维护 hell 。考虑到这一点,我相信这个问题最终归结为 C++ 链接问题。还有其他方法可以实现我正在寻找的功能吗?

编辑

ScriptProcessorNode 在我的情况下不是一个选项,因为它的性能使其在生产中几乎无法使用。这需要在 ui/主线程上处理音频样本,这绝对是疯狂的。

编辑2

AudioWorklets现已在 Electron 中使用一段时间了,与 ScriptProcessorNode(或更糟糕的是,AnalyzerNode)不同,它具有低延迟性,并且对于真正的 C++ 支持的音频处理(即使是实时的)也非常可靠。

如果有人想继续写一个基于 AudioWorklet 的答案,我会很乐意接受,但要注意:这是一个非常非常先进的领域,也是一个非常深的兔子洞,需要克服无数的障碍甚至在一个非常简单的通用直通原型(prototype)之前就可以通过(特别是因为目前在 Electron 中,需要原子同步、缓冲跨线程音频处理来实现这一点,因为 https://github.com/electron/electron/issues/22503 ——尽管获得了 native C++ 插件进入一个音频渲染器线程,更不用说同时使用多个线程,可能同样具有挑战性)。

最佳答案

MediaStream header 是 Blink renderer modules 的一部分,对我来说,如何从 nan 插件中检索它并不明显。

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

  • GetPropertyNames()
  • 获取(上下文,索引)
  • 设置(上下文、键、值)
  • 有(上下文,键)

除非您确实需要严格定义的接口(interface),否则为什么不完全避免这个问题并只使用已有的动态类型呢?

要专门获取音频数据,您需要调用 getAudioTracks()在 v8::Object 上,它可能看起来像这样?

注意:我认为你不需要上下文,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()();
}

关于javascript - 如何从 C++ 插件中的 'MediaStream' 对象读取音频数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48994486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com