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

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,这将更容易/可能,但我宁愿不参与维护地狱.

我想知道如果没有这样做是否可能,并且就我的研究而言,我确信我需要做两件事:

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

另外,正如我所说,我相信我可以自己编译chrome/blink然后我会有这个lib文件,但这对于Electron来说是一个维护地狱.考虑到这一点,我相信这个问题最终归结为C++链接问题.有什么其他方法可以做我正在寻找的东西吗?

编辑

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

jay*_*ypb 1

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)