按顺序播放音频文件列表
问题描述:
我已经遇到过一种情况。我正在用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中的文件。