2009-12-24 144 views
0

我已經遇到過一種情況。我正在用C#.NET編寫Windows應用程序。 我想一個接一個地播放多個.wav文件,然後連續播放。按順序播放音頻文件列表

有沒有可以允許的類?否則,我將如何實現它?

我嘗試過使用MCI,它的工作原理是使用通知標誌和截取MM_MCINOTIFY消息,但是它非常混亂並且使我的代碼複雜化。

回答

0

如果文件列表是固定的,那麼就做一個播放列表,並把它傳遞給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中的文件。