今日、この問題をもう一度試すことにし、最終的に実行時にOGGファイルをSoundEffect
オブジェクトにロードすることに成功しました。これが私がしたことです!まず、OGGファイルをデコードできるクラスを含む以下のライブラリをダウンロードします。
前提条件-ライブラリのダウンロード
ライブラリにはすでにサンプルがDynamicSoundEffectInstance
ありますが、オーディオを使用してストリーミングします。しかし、それを通常のSoundEffect
オブジェクトに一度にロードしたかったので、プロセスは少し異なりました。
ステップ1-ファイルをデコードする
最初にのインスタンスを作成OggDecoder
し、ファイルで初期化します。
decoder = new OggDecoder();
decoder.Initialize(TitleContainer.OpenStream(@"sound.ogg"));
ステップ2-デコードされたデータを取得する
すべてのデータをバッファに読み込みます。これは、ファイルのデコードされた生PCMデータです。
byte[] data = decoder.SelectMany(chunk => chunk.Bytes.Take(chunk.Length)).ToArray();
手順3-完全なWaveファイルヘッダーを含むストリームからSoundEffectを作成する
ただし、そのストリーム SoundEffect
必要なは、生データだけでなく、完全なWaveファイルヘッダーも含まれ必要があります。このヘルパーメソッドを使用して、ヘッダーとデータを書き込むことができます。
private static void WriteWave(BinaryWriter writer, int channels, int rate, byte[] data)
{
writer.Write(new char[4] { 'R', 'I', 'F', 'F' });
writer.Write((int)(36 + data.Length));
writer.Write(new char[4] { 'W', 'A', 'V', 'E' });
writer.Write(new char[4] { 'f', 'm', 't', ' ' });
writer.Write((int)16);
writer.Write((short)1);
writer.Write((short)channels);
writer.Write((int)rate);
writer.Write((int)(rate * ((16 * channels) / 8)));
writer.Write((short)((16 * channels) / 8));
writer.Write((short)16);
writer.Write(new char[4] { 'd', 'a', 't', 'a' });
writer.Write((int)data.Length);
writer.Write(data);
}
そのメソッドを使用して、データをフィード可能なストリームに書き込みます。 SoundEffect.FromStream
。
using (MemoryStream stream = new MemoryStream())
using(BinaryWriter writer = new BinaryWriter(stream))
{
WriteWave(writer, decoder.Stereo ? 2 : 1, decoder.SampleRate, data);
stream.Position = 0;
soundEffect = SoundEffect.FromStream(stream);
}
ステップ4-通常どおりSoundEffectを使用する
OGGファイルがSoundEffect
読み込まれ、コンテンツパイプラインを通じて読み込まれた他のファイルと同じように使用できます。
soundEffect.Play();