70 votes

Comment lire des données audio d'un objet 'MediaStream' dans un addon C ++

Après une sueur de sang et de larmes j'ai enfin réussi à mettre en place un Nœud C++ addon et d'enfoncer le web, une plate-forme standard MediaStream objet dans l'un de ses méthodes C++ pour de bon. Pour la compatibilité entre les différents V8 et Node.js versions, je suis aide Maternelle Abstractions pour Node.js (nan):

addon.cc

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

addon.js

setStream(new MediaStream());

Pour ce que ça vaut, cela fonctionne correctement (c'est à dire qu'il n'anéantit pas le moteur de rendu processus à vue), et je peux vérifier la présence de l' MediaStream objet, par exemple, par le retour de son constructeur nom du C++ méthode:

addon.cc

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

Lorsqu'il est appelé à partir de JavaScript par setStream, ce serait de retour la chaîne MediaStream, de sorte que l'objet est bel et bien là. Je peux aussi retourner l' mediaStream objet lui-même et tout fonctionnera correctement, donc c'est en effet l'objet dont j'ai besoin.

Alors, comment pourrais-je lire des données audio (c'est à dire des échantillons audio) à partir de ce MediaStream objet en C++? Au passage, les données réelles de lire (et de traitement) pourrait être fait en séparer std::thread.


Bounty Mise À Jour

Je comprends que ce serait un peu plus facile/possible si je ont été de la compilation d'Électrons et/ou de Chrome moi-même, mais je préfère ne pas en arriver à l'entretien de l'enfer.

Je me demandais si il serait possible, sans le faire, et dans la mesure de mes recherches, je suis convaincu que j'ai besoin de 2 choses à faire ceci:

  1. Pertinentes fichiers d'en-tête, pour qui, je crois, clin public devrait être suffisant
  2. Un chrome/clin fichier de bibliothèque (?), pour résoudre les symboles externes, de même pour le nœud.dylib fichier

Aussi, comme je l'ai dit, je crois que je pourrais compiler chrome/blink moi-même et puis je l'aurais ce fichier lib, mais ce serait une maintenance de l'enfer avec des Électrons. Avec cela à l'esprit, je crois que cette question dépend en définitive un C++ reliant question. Est-il une autre approche pour faire ce que je suis à la recherche?

Modifier

ScriptProcessorNode n'est pas une option dans mon cas, comme ses performances les rend presque inutilisable en production. Cela nécessiterait de traiter des échantillons audio sur l'interface utilisateur/thread principal, ce qui est absolument fou.

1voto

jaypb Points 1247

Le MediaStream en-tête est la partie du Clignotement du convertisseur de modules, et il n'est pas évident pour moi comment vous pouvez les récupérer à partir de nan plugin.

Donc, au lieu de cela nous allons regarder ce que vous faites , à savoir un v8::Object. Je crois que la v8::Objet expose toutes les fonctionnalités dont vous avez besoin, il a:

  • GetPropertyNames()
  • Get(contexte, index)
  • Set(contexte, clé, valeur)
  • A(contexte, clé)

À moins que vous vraiment besoin d'un strictement définies interface, pourquoi ne pas éviter la question tout à fait et juste utiliser le type dynamique que vous avez déjà?

Pour obtenir des données audio spécifiquement, vous aurez besoin d'appeler getAudioTracks() sur la v8::Objet, qui ressemble probablement à quelque chose comme ça?

Remarque: je ne pense pas que vous avez besoin d'un contexte, v8 semble être heureux avec elle étant vide: v8/src/api/api.cc

Devrait ressembler à quelque chose comme ceci, en plus de certains de massage de types dans et hors de 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()();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X