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.
Antworten:
TL; DR: In Unity ist dies nicht nativ möglich
Microphone.Start
Gibt eineAudioClip
mit 3 Lasttypen zurück , von denen keiner zu Ihrem Anwendungsfall passt. Für alle (auch für den.Streaming
einen) muss sich der gesamte Clip bereits auf dem Computer des Benutzers befinden. Das VerwendenAudioClip.GetData()
und Senden einer Datei über das Netzwerk (in Unity, usingNetworking.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:
System.Threading
-Thread, um Ihr Audio so zu verarbeiten, dass Framerate und Audiowiedergabe nicht miteinander gekoppelt sind.DirectSound
was 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.Client ==> Server ==> Client
das zusätzliche Latenzzeiten verursacht.quelle