Es gibt Situationen wo eine simple Ausgabe von Audio Streams nicht ausreicht. Dafür muss tiefer in die Trickkiste gegriffen werden.
Mit Windows Vista wurde eine neue Windows API für Audio und Video eingeführt, wobei zu erwähnen ist, dass es sich um eine komplette Umstellung handelte. Deshalb war es vor allem zu Beginn doch ein wenig kompliziert, Audio Manipulationen vorzunehmen.
Zum Glück wurde aber die neue API schnell von verschiedenen OpenSource Projekten adaptiert, was das Manipulieren von Audio wiederum vereinfacht hat. Um einige Beispiele zu nennen wären das IrrKlang, DirectShow oder NAudio.
Das Benutzen von NAudio ist sehr einfach, trotzdem möchte ich hier einige weniger bekannte Manipulationen vorstellen, die sich mit dieser Bibliothek verwirklichen lassen:
Zwischen zwei Streams wechseln
Soll während dem Abspielen zwischen zwei Streams gewechselt werden, muss darauf geachtet werden, dass die beiden Dateien die gleiche Sample Rate bzw. Bittiefe (Anz. Bits, mit der jedes einzelne Sample repräsentiert wird) aufweisen.
Ist diese Bedingung erfüllt, können die Dateien zuerst folgendermassen eingelesen werden:
WaveFileReader reader = new WaveFileReader(fileName1); var channelStream1 = new WaveChannel32(new WaveOffsetStream(reader));
Danach können die beiden Streams dem WaveMixerStream zugewiesen werden:
var mixer = new WaveMixerStream32(); mixer.AddInputStream(channelStream1); channelStream1.Volume = 1.0f; mixer.AddInputStream(channelStream2); channelStream2.Volume = 0.0f;
Nun können die Streams abgespielt werden:
var wavePlayer = new WaveOut(); wavePlayer.Init(mixer); wavePlayer.Play();
Während dem Abspielen können die Lautstärken der beiden Streams variiert werden, wobei sich der klarste Unterschied der beiden Dateien herauskristallisiert, wenn beim ersten Stream das Volume auf 0 gesetzt wird und beim zweiten Stream gegenteilig auf 1 gesetzt wird.
Streams einen bestimmten Ausgabekanal zuweisen
Eine weitere Aufgabenstellung könnte folgende sein. Zwei Mono Dateien sollen jeweils auf einem anderen Kanal ausgegeben werden, um einen direkten Vergleich zeitgleich zu hören. Auch hier gilt die Bedingung, dass die Dateien die gleiche Sample Rate bzw. Bittiefe haben müssen.
Für diese Aufgabenstellung kann der MultiplexingWaveProvider verwendet werden.
Wie im oberen Beispiel können die zwei Dateien eingelesen werden. Die beiden WaveChannel32 Streams lassen sich dann folgendermassen dem Provider zuweisen:
var provider = new MultiplexingWaveProvider(
new IWaveProvider[] { channelStream1, channelStream2 },
2
);
Wobei die 2 am Konstruktor Ende die Anzahl Ausgabekanäle spezifiziert wird.
Danach lassen sich die Mono Streams auf die entsprechenden Ausgabekanäle zuweisen:
provider.ConnectInputToOutput(0, 0); //Mono Stream 1 auf Ausgabekanal 1 provider.ConnectInputToOutput(1, 1); //Mono Stream 2 auf Ausgabekanal 2
Es können natürlich auch Stereo Dateien verwendet werden, es ist dabei aber zu beachten, dass pro Ausgabekanal nur ein Stream zugewiesen werden kann. Ansonsten wird das erste Mapping überschrieben.
Das Abspielen der Streams erfolgt wie im ersten Beispiel, nur dass diesmal der Provider in der Init-Methode übergeben wird.
var wavePlayer = new WaveOut(); wavePlayer.Init(provider); wavePlayer.Play();
Weitere Beispiele sowie die Library sind auf der Projektseite auf Codeplex zu finden.
Schreiben Sie einen Kommentar