按顺序播放音频文件列表

时间:2009-12-24 18:06:56

标签: c# .net winapi mci

我遇到过一种情况。我正在用C#.NET编写一个Windows应用程序。 我想一个接一个地播放多个.wav文件,然后继续这样做。

有没有可以允许的课程?否则,我该如何实施呢?

我尝试使用MCI并使用通知标志和拦截MM_MCINOTIFY消息,但它相当混乱并使我的代码复杂化。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

如果文件列表已修复,则只需制作一个播放列表并将其传递给MediaPlayer实例。媒体播放器接受.m3u格式或.wvx格式的播放列表。

但是如果你需要动态选择文件的顺序,那么最简单的方法就是使用PlaySound()。您可以将其单独的文件名或指针传递到内存中的波形数据(您必须将其编组为非托管内存)。将一个线程专用于声音,并让它在循环中调用PlaySound,或使用SND_ASYNC

请注意,只需查看wave文件的标题即可知道播放文件的准确性需要多长时间。

[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中的文件。