Как читать аудиоданные из объекта MediaStream в аддоне C++

После потоветки крови и слез мне наконец удалось создать узел Node C++ и MediaStream один из стандартных средств MediaStream в веб-платформу в один из его методов C++. Для совместимости в разных версиях V8 и Node.js я использую Native Abstractions для Node.js(nan):

addon.cc

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

addon.js

setStream(new MediaStream());

Для того, что это стоит, это работает правильно (т. MediaStream процесс визуализации на вид), и я могу проверить наличие объекта MediaStream, например, вернув его имя конструктора из метода C++:

addon.cc

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

При вызове из JavaScript через setStream это вернет строку MediaStream, поэтому объект определенно существует. Я также могу вернуть объект mediaStream сам, и все будет работать правильно, так что это действительно тот объект, который мне нужен.

Итак, как бы я мог читать аудиоданные (т.е. образцы аудио) из этого объекта MediaStream в C++? В качестве побочного элемента фактические данные (и обработка) будут выполняться в отдельной std::thread.


Обновление Bounty

Я понимаю, что это было бы проще или возможнее, если бы я сам собирал Electron и/или Chromium, но я бы предпочел не участвовать в этом афере обслуживания.

Мне было интересно, можно ли это сделать без этого, и, насколько мне известно, я убежден, что мне нужно 2 вещи, чтобы сделать это:

  1. Соответствующие файлы заголовки, для которых я считаю, моргать общественность должны быть адекватными
  2. Файл библиотеки chromium/blink (?) Для разрешения внешних символов, аналогично файлу node.dylib

Кроме того, как я уже сказал, я считаю, что сам мог бы скомпилировать хром/миг, и тогда у меня будет этот файл lib, но это будет адский ад с Electron. Имея это в виду, я считаю, что этот вопрос в конечном итоге сводится к вопросу о C++. Есть ли другой подход к тому, что я ищу?

редактировать

ScriptProcessorNode не является вариантом в моем случае, так как его производительность делает его практически непригодным для производства. Это потребовало бы обработки звуковых образцов на ui/main thread, что абсолютно безумно.

Ответы

Ответ 1

Заголовок MediaStream является частью модулей рендеринга Blink renderer modules, и для меня не очевидно, как вы можете извлечь это из плагина nan.

Итак, давайте посмотрим на то, что у вас есть, а именно на v8 :: Object. Я считаю, что v8 :: Object предоставляет всю необходимую вам функциональность:

  • GetPropertyNames()
  • Получить (контекст, индекс)
  • Установить (контекст, ключ, значение)
  • Имеет (контекст, ключ)

Если вам действительно не нужен строго определенный интерфейс, почему бы вообще не избежать этой проблемы и просто использовать динамический тип, который у вас уже есть?

Для получения аудиоданных, в частности, вам нужно вызвать 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()();
}