So senden Sie Voice over Unity Networking - UNET

7

Mit diesem Code-Snippet kann ich Audio von meinem Mikrofon aufnehmen und ausführen:

  void OnGUI() {
        if (GUI.Button(new Rect(0, 0, 100, 20), "record")) {
           // Microphone.End(Microphone.devices[0]);
            audsourceAttached.clip = Microphone.Start(Microphone.devices[0], false, 3, 44100);
        }
        if (GUI.Button(new Rect(0, 30, 100, 20), "Stop"))
        {
            //Microphone.End(Microphone.devices[0]);
            audsourceAttached.Play();
        }
    }

Jetzt bin ich bereit , dieses Audio über das Netzwerk zu senden (in meinem lokalen Netzwerk - eine weitere Instanz des Spiels). Wie kann ich das machen?

Ich habe versucht, dies auf Google zu finden, konnte jedoch keine nützlichen Lösungen / Links finden.

Wie kann ich Audio über ein Mikrofon senden, z. B. Echtzeit-Chat in einem Spiel / etc.

Muhammad Faizan Khan
quelle
1
Nicht hilfreicher Kommentar: bitte nicht. Viele Spieler möchten nie, dass das Spiel Audio überträgt. Wir haben bereits Skype, Dampf, Teamspeak und viele viele viele andere Lösungen für das, und Ihr Spiel mit ihnen stören.
Peter
4
Ich sehe dies nicht als Problem, solange Sie es zugunsten von Skype, Steam, Teamspeak usw. ausschalten können. Außerdem gibt es einige Randfälle, in denen Mikrofon-Audio in Kombination mit dem Quellort anstelle von a verwendet wird traditioneller Voice-Chat, dh er ist nur hörbar, wenn Sie dem sprechenden Spieler im Spiel nahe genug sind. Ich denke zum Beispiel, dass DayZ und / oder ArmA dies tun.
Christian
Hier kann ein Code sein, der Sie interessiert: answers.unity3d.com/questions/737002/wav-byte-to-audioclip.html
Lasse
2
Ich bin damit einverstanden, dass es viele Gründe gibt, Voice-Chat direkt in das Spiel zu integrieren, anstatt sich auf Tools von Drittanbietern zu verlassen. Es ermöglicht, Spieler ad-hoc miteinander zu verbinden, wenn sie sich in einer offenen Welt oder in einer Spielelobby treffen. In einem teambasierten Spiel ohne Respawn können Sie auch verhindern, dass tote Spieler mit den Lebenden sprechen. Beachten Sie jedoch, dass das Abrufen und Senden der Wellenform über das Netzwerk möglicherweise keine sehr guten Ergebnisse liefert. Es wäre besser, es in einem Audio-Codec zu codieren, der für die Sprachcodierung in Echtzeit über eine geringe Bandbreite ausgelegt ist.
Philipp
@Philipp vielleicht hast du recht, aber ich teile nur meine Bemühungen mit dem, was ich bisher getan habe. Gibt es weitere Details, bitte teilen Sie Ihre vollständige Antwort
Muhammad Faizan Khan

Antworten:

4

TL; DR: In Unity ist dies nicht nativ möglich

Microphone.StartGibt eine AudioClipmit 3 Lasttypen zurück , von denen keiner zu Ihrem Anwendungsfall passt. Für alle (auch für den .Streamingeinen) muss sich der gesamte Clip bereits auf dem Computer des Benutzers befinden. Das Verwenden AudioClip.GetData()und Senden einer Datei über das Netzwerk (in Unity, using Networking.NetworkTransport.Send()) würde schrecklich nicht reagieren und kann erst dann erfolgen , wenn die Aufnahme ihren Clip beendet hat. Dadurch werden Audiocodecs ignoriert, die mehrere Threads verwenden (Unity ist nicht threadsicher) und die Echtzeitnatur von Audiogerätedaten berücksichtigen.

Was Sie brauchen, ist eine Möglichkeit, die Daten des Audiogeräts in Echtzeit abzurufen, für die Unity keinen Mechanismus bereitstellt und daher RTC nicht nativ unterstützen kann. Diese Antwort kommt zu dem gleichen Ergebnis

Im Asset Store gibt es Lösungen von Drittanbietern. Hier ist eine solche Lösung, die in der oben verlinkten Antwort erwähnt wird: Dissonance Voice Chat . Beim Durchsuchen der Dateiliste werden eine native DLL, der Opus- Audiocodec und eine Reihe von C # -Dateien für die Schnittstelle mit dem nativen Code verwendet.

Das Rollen Ihrer eigenen, was ich nicht empfehle, würde Folgendes erfordern:

  • Verwenden Sie einen separaten C # System.Threading-Thread, um Ihr Audio so zu verarbeiten, dass Framerate und Audiowiedergabe nicht miteinander gekoppelt sind.
  • Das Abrufen der Audiodaten ist in C # nicht trivial. .NET verwendet, DirectSoundwas ein Windows-Ding ist. Mono unterstützt dies nicht . Dies bedeutet, dass Sie entweder selbst eine plattformübergreifende Lösung implementieren müssen oder sich auf eine Bibliothek verlassen müssen, die dies bereits tut.
  • Für den Transport über das Netzwerk ist ein Socket mit .NET-Sockets erforderlich . Diese scheinen robust zu sein und werden in Mono unterstützt.
  • Ihre Sockets sollten als P2P-Multicast transportiert werden. Auf diese Weise können Sie einen Audiostream gleichzeitig an mehrere Personen senden. Außerdem wird ein Setup übersprungen, Client ==> Server ==> Clientdas zusätzliche Latenzzeiten verursacht.
  • Sie möchten auch einen Codec, der sicherstellt, dass Sie nicht einfach unkomprimiertes Audio ohne weiteres senden. Es gibt viele, für die höchstwahrscheinlich eine Schnittstelle zu einer anderen nativen Bibliothek erforderlich ist.
Coburn
quelle