ある状況に直面してきました。C# .NET で Windows アプリを作成しています。複数の .wav ファイルを連続して再生したい。
それを許可できるクラスはありますか?そうでなければ、どのように実装しますか?
MCI を使用してみましたが、通知フラグと MM_MCINOTIFY メッセージのインターセプトを使用して動作しますが、やや面倒でコードが複雑になります。
ファイルのリストが修正されている場合は、プレイリストを作成してMediaPlayerのインスタンスに渡します。メディアプレーヤーは、.m3u形式または.wvx形式のいずれかのプレイリストを受け入れます。
ただし、ファイルの順序を動的に選択する必要がある場合、最も簡単な方法はPlaySound()を使用することです。個々のファイル名、またはメモリ内のウェーブデータへのポインタを渡します(アンマネージメモリにマーシャリングする必要があります)。スレッドをサウンド専用にしてPlaySound
、ループで呼び出すか、を使用しますSND_ASYNC
。
ウェーブファイルのヘッダーを見るだけで、ファイルを高精度で再生するのにかかる時間を知ることができることに注意してください。
[DllImport("WinMM.dll")]
public static extern bool PlaySound(string name, int hModule, int flags);
// see mmsystem.h for these flags
public int SND_SYNC = 0x00000000; // don't return until playback is done
public int SND_ASYNC = 0x00000001; // play asynchronously
public int SND_NODEFAULT = 0x00000002; // don't play the default sound if n
public int SND_MEMORY = 0x00000004; // name is actual a pointer to a WAVEHEADER
public int SND_LOOP = 0x00000008; // loop the sound until next call to PlaySound (use with SND_ASYNC)
public int SND_NOSTOP = 0x00000010; // don't stop any currently playing sound
public int SND_FILENAME = 0x00020000; // name is a filename (it's a sound name otherwise)
public int SND_NOSTOP = 0x00000010; // don't stop any currently playing sound
これらの方法はどちらも、ビット深度とサンプルレートが異なるファイルを混在させることができます。ただし、どちらもファイル間にわずかな沈黙を置きます。ファイル間の遷移をシームレスにする必要がある場合は、サードパーティのオーディオエンジンを見つけるか、独自のオーディオエンジンを使用する必要があります。
または、複数のウェーブファイルファイルストリームリーダーを作成することもできます(C#ではなくC ++では、アンマネージコードである必要があります)。また、デフォルトの.wavファイルリーダーの代わりに使用して、MediaPlayerでファイルを再生します。