Как читать аудиоданные из объекта 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 вещи, чтобы сделать это:
- Соответствующие файлы заголовки, для которых я считаю, моргать общественность должны быть адекватными
- Файл библиотеки 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()();
}