Ich arbeite an einer Anwendung vom Typ "Game Maker" für Windows, bei der der Benutzer seine eigenen Assets importiert, um sie im Spiel zu verwenden. Ich muss in der Lage sein, diesen Inhalt zur Laufzeit auf der Motorseite zu laden.
Ich möchte jedoch nicht, dass der Benutzer mehr als die XNA-Laufzeit installieren muss, sodass das Aufrufen der Inhaltspipeline zur Laufzeit nicht möglich ist.
Für Bilder geht es mir gut mit Texture2D.FromStream.
Ich habe auch festgestellt, dass XNA 4.0 der SoundEffect-Klasse eine FromStream-Methode hinzugefügt hat, aber nur PCM-Wave-Dateien akzeptiert.
Ich möchte jedoch mehr als nur Wave-Dateien unterstützen, zumindest MP3.
Irgendwelche Empfehlungen? Vielleicht eine C # -Bibliothek, die die Dekodierung in das PCM-Wellenformat durchführen würde.
Antworten:
Ich hatte die FromStream-Methode nicht bemerkt, das ist gut zu merken. Ich bin jetzt neugierig auf die Verwendung von FromStream vs DynamicSoundEffectInstance, da Sie theoretisch mit beiden Methoden viel von der gleichen Arbeit erledigen könnten.
Google hat diese Bibliothek aufgedeckt : http://robburke.net/mle/mp3sharp/ Und Sie können möglicherweise auch lame.exe aus Ihrer App heraus aufrufen, um den Sound zu dekodieren.
Ich wäre jedoch vorsichtig mit MP3, es ist eine legale Dose Würmer. Adobe zahlt Fraunhofer eine hohe Gebühr für das Recht, es in Flash zu verwenden. Ogg Vorbis ist ein überlegenes Format, das mit kostenloser Open-Source-Software leicht aus MP3 konvertiert werden kann, und es scheint viel mehr C # /. Net-Decoder-Bibliotheken dafür zu geben.
quelle
Ich habe beschlossen, dieses Problem heute noch einmal zu versuchen, und es endlich geschafft, eine OGG-Datei zur Laufzeit in ein
SoundEffect
Objekt zu laden . Folgendes habe ich getan! Laden Sie zuerst die folgende Bibliothek herunter, die eine Klasse enthält, die OGG-Dateien dekodieren kann:Voraussetzung - Bibliothek herunterladen
Die Bibliothek hat bereits ein Beispiel, verwendet
DynamicSoundEffectInstance
und streamt jedoch das Audio. Aber ich wollte alles auf einmal in ein normalesSoundEffect
Objekt laden, damit der Prozess etwas anders war.Schritt 1 - Datei dekodieren
Erstellen Sie zuerst eine Instanz von
OggDecoder
und initialisieren Sie sie mit Ihrer Datei:Schritt 2 - Dekodierte Daten abrufen
Lesen Sie alle Daten in einen Puffer. Dies sind die decodierten PCM-Rohdaten der Datei:
Schritt 3 - Erstellen Sie SoundEffect aus einem Stream mit dem vollständigen Wave-Datei-Header
Der
SoundEffect
erforderliche Stream muss jedoch nicht nur die Rohdaten enthalten, sondern auch den vollständigen Header der Wave-Datei. Mit dieser Hilfsmethode können Sie den Header und die Daten schreiben:Verwenden Sie diese Methode, um die Daten in einen Stream zu schreiben, dem Folgendes zugeführt werden kann
SoundEffect.FromStream
:Schritt 4 - Verwenden Sie den SoundEffect wie gewohnt
Ihre OGG-Datei ist jetzt geladen und kann wie jede andere Datei verwendet werden,
SoundEffect
die über die Inhaltspipeline geladen wird:quelle
Wenn Sie nur auf Windows abzielen, ist es für mich am einfachsten, die XNA Audio-API vollständig zu umgehen und etwas anderes zu verwenden.
Ich fand die FMOD-API großartig dafür und sie wird sogar bereits mit einem C # -Wrapper geliefert. Ich habe meinen eigenen Wrapper um ihren hinzugefügt und hier ist das absolute Minimum, das Sie benötigen, um einen Sound aus einer Datei zu laden und abzuspielen:
Der Wrapper:
Und wie man es benutzt:
Natürlich ist dieser Wrapper nur das absolute Minimum, sollte aber einfach zu erweitern sein, um alle anderen Funktionen verfügbar zu machen, die Sie benötigen.
quelle