0

我遇到了一个情况。我正在用 C# .NET 编写一个 Windows 应用程序。我想一个接一个地播放多个 .wav 文件并连续播放。

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

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

4

2 回答 2

0

如何制作播放列表并在 C# 中播放?

于 2009-12-24T18:11:24.587 回答
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

这两种方法都允许您混合不同位深度和采样率的文件。但他们也会在文件之间放置少量的沉默。如果您需要文件之间的无缝转换,那么您将需要找到一个 3rd 方音频引擎,或者滚动您自己的。

或者,您可以编写一个多波形文件文件流阅读器(在 C++ 中,而不是 C# 中,它必须是非托管代码)。并使用它代替默认的 .wav 文件阅读器来播放 MediaPlayer 中的文件。

于 2009-12-25T01:51:16.003 回答