2016-04-16 6 views
10

Der Zugriff auf das Benutzermikrofon über navigator.getUserMedia ist ziemlich einfach. Aber was ist, wenn ich einen mobilen Browser verwende und Audio aus der Ferne aufnehmen möchte, wie im "Freisprechmodus"?Web Audio: Wie kann ich ein mobiles Mikrofon erhalten, um Audio aus der Entfernung aufzunehmen?

Wie würde ich das erreichen? Es scheint native Apps zu geben, die das erreichen können, aber was ist mit Web Audio?

Der Zweck ist das Senden von Nachrichten zwischen Geräten mit DTMF. Ich habe das schon mit meinem Laptop erreicht, weil sein Mikrofon Umgebungsgeräusche aus großer Entfernung aufnehmen kann, aber jedes Handy, auf das ich Zugriff habe, scheint nur Ton in der Nähe des "Mundstücks" aufzuzeichnen und so muss ich das Telefon extrem nah an der Hand halten Quelllautsprecher für eine geringe Chance, eine Nachricht erhalten zu haben. Dies vereitelt den Zweck, wenn ich das mobile Mikrofon nicht dazu bringen kann, Audio aus der Entfernung aufzunehmen.

EDIT: Mit Abstand, ich meine mehr als ein paar Füße, im Gegensatz zu nur Zentimeter. Umgebungsgeräusche, im Gegensatz zu lokalisierten Sounds neben dem Mikrofon.

+0

Sind Sie sicher, dass es sich im Lautsprechermodus um einen anderen "Modus" handelt oder nehmen Sie das alles nur an? –

+0

@ NicholasKyriakides Ich nahm an, dass ein anderer Modus existiert, da eine Verstärkung der ankommenden Wellenform nicht die Qualität verbessert, die ausreicht, um mein Audiosignal zu decodieren. Durch Amplifikation multipliziere ich nur die Samples. Ich hätte nicht gedacht, dass das funktionieren würde, aber es war einen Versuch wert.Die Sound Analyzer App für Android, die etwas sehr ähnlich macht, was ich erreichen möchte, ist in der Lage, entfernte Töne aufzunehmen und ein Spektrogramm zu zeichnen, also mache ich entweder etwas nicht richtig oder es ist unmöglich mit Web Audio. – Ravenstine

+0

Das kann Ihnen helfen https://webrtc.github.io/samples/src/content/devices/input-output/ – Blindman67

Antwort

2

Dies kann nicht durchgeführt werden, da es direkt mit der Hardware des Geräts zusammenhängt. Wenn die Geräte-Hardware (Mikrofon) keine Geräusche aus Metern empfangen kann, kann nichts getan werden.

+1

Dies wäre richtig, wenn meine Hardware dies nicht unterstützt, aber es tut. Siehe die obigen Kommentare; Meine ursprüngliche Frage wurde beantwortet, nur nicht in eine formelle Antwort getippt. Es stellte sich heraus, dass, obwohl es tatsächlich einen "Freisprechmodus" gibt, dies nicht das eigentliche Problem war, da dies das Standardgerät war. Das eigentliche Problem scheint auch nicht das Knotenvolumen zu sein. An diesem Punkt glaube ich, dass es ein Softwareproblem ist, da mein Ziel ist, Frequenzpräsenz zu erreichen, und ich habe Apps, die das tun, aber ich kann das nicht auf dem mobilen Chrome erreichen (aber ich kann auf dem Desktop). – Ravenstine

+1

Sie sind in der Tat willkommen, Ihre Antwort basierend auf den obigen Kommentaren zu überarbeiten. Es gibt immer noch ein Kopfgeld, um zu jemandem zu gehen. :) – Ravenstine

+0

Ok, vielleicht kann eine Web-Audio-Dokumentation helfen zu beantworten, wenn es möglich ist, dies auf mobilen Chrom zu tun –

0

Vor zwei Jahren habe ich eine webrtc (mit Google Beispiel) implementiert, die auf einem mobilen Webbrowser funktioniert, und der Ton wird mit Umgebungsleveln aufgenommen. Ich habe wirklich keine tiefe Code-Analyse von Google-Bibliotheken gemacht, aber vielleicht kannst du hier anfangen.

1

Ich beantworte meine eigene Frage hier. Danke an alle, die geholfen haben, obwohl keine der hier geposteten Antworten zufriedenstellend waren, IMO.

In neueren Versionen von Chrome verfügt navigator.mediaDevices über eine Funktion mit der Bezeichnung enumerateDevices, mit der verfügbare Hardwaregeräte, einschließlich Mikrofone, aufgelistet werden können. Wie sich herausstellt, gibt dies ein "Freisprecheinrichtung" Gerät auf meinem Android-Handy zurück. Wenn Sie also ein Gerät verwenden, bei dem Sie vermuten, dass die Freisprechfunktion nicht als Standardbrowsermikrofon eingestellt ist und Sie (oder Ihr Benutzer) Chrome Version 47 oder höher verwenden, können Sie die von enumerateDevices zurückgegebenen Geräte-IDs verwenden, um eine bestimmte Nummer anzugeben Mikrofon.

Wenn Ihr Benutzer also eine Option in einem Auswahlelement für ein bestimmtes Mikrofongerät auswählt, würden Sie die ID für dieses Gerät übernehmen und an getUserMedia übergeben.

navigator.getUserMedia({ audio: {deviceId: {exact: <insert device uuid here>}} }, callback) 

Bitte beachte, dass, wie dieses Posting, das enumerateDevices API nur auf Chrome verfügbar ist. In anderen Browser- oder Web-Ansichten wird dies wahrscheinlich nicht funktionieren. Wenn die Lautstärke des Mikrofons für Ihre Anwendung zu niedrig ist, können Sie die Lautstärke erhöhen, indem Sie eine gainNode für Ihren AudioContext erstellen.

volume  = context.createGain() 
volume.gain.value = 3 // raises the volume to 300% 
audioInput = context.createMediaStreamSource(e) 
audioInput.connect(volume) 

Oder, wenn Sie mit rohen Proben zu tun haben, können Sie buchstäblich jede Probe mit einer Zahl multiplizieren, bevor sie vorbei, was auch immer Funktion, die Sie verwenden, um sie zu verarbeiten.