0


0

オーディオファイルのリストを順番に再生する

私は状況に直面しています。 C#でWindowsアプリを書いています .NET. I want to play multiple .wav files one after another and do that 継続的に。

それを可能にするクラスはありますか? そうでなければ、どのように実装しますか?

MCIを使用してみましたが、MM_MCINOTIFYメッセージの通知フラグとインターセプトを使用して動作しますが、かなり複雑でコードが複雑になります。

2 Answer


0


ファイルのリストが修正されている場合は、プレイリストを作成して、MediaPlayerのインスタンスに渡します。 メディアプレーヤーは、.m3u形式または.wvx形式のプレイリストを受け入れます。

ただし、ファイルの順序を動的に選択する必要がある場合、最も簡単な方法はPlaySound()を使用することです。 個々のファイル名、またはメモリ内のWaveデータへのポインタを渡します(管理されていないメモリにマーシャリングする必要があります)。 スレッドをサウンド専用にし、ループで「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でファイルを再生します。