Windows Forms程序中嵌入并播放Wave音频文件
引子http://www.cnblogs.com/anderslly/archive/2007/01/23/embeddingwavfilesinwinform.html
前言
本文介绍了将Wave音频文件嵌入程序并使用System.Media命名空间中的类进行播放的一种方法,受益于System.Media类库,本文中的示例无须引用”winmm.dll”来播放音频文件,所以这个方法实现起来只需要更少的代码。
示例中使用的音频文件作为资源嵌入到了程序中,这样在安装程序时就不再需要将外部的Wave文件一起打包了,同时这种方法也排除了在安装程序后音频文件被移除或替换的潜在可能。
开始
示例程序是下面这样一个简单的窗体:解决方案资源管理器的示意图则是这样的:
解决方案中只有一个项目:EmbeddingWavFiles。WavFiles文件夹中的两个wave文件是嵌入到资源文件的音频文件,它们不会随主程序一起打包,一旦嵌入资源文件,程序就可以不依赖它们了。
将音频文件添加到资源文件的方法
要将音频文件添加到解决方案,先在解决方案资源管理器中打开Resources.resx文件,这时你会看到一个下拉列表:这里选择Audio(音频)类型,然后点击它右边的”Add Resource”,这时会打开一个文件浏览器,在这里选择要添加的资源(此处只能选择wav类型的文件)。
将音频文件添加到资源文件后,选择其中的每一项,按F4打开该项的属性窗口,将Persistence属性设置为” Embedded in .resx”:
此时编译程序,会看到” Resources.resx”文件较之开始体积大了不少。
至此,文件已经添加完毕,并得到了正确的设置,现在就可以在项目内使用它们了。
播放Wave文件的代码:
1、添加命名空间:System.Media;
2、添加播放文件的代码:
播放文件一次:
try
{
SoundPlayer player = new
SoundPlayer(EmbeddingWavFiles.Properties.Resources.sound);
player.Play();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ": " + ex.StackTrace, "Error");
}
{
SoundPlayer player = new
SoundPlayer(EmbeddingWavFiles.Properties.Resources.sound);
player.Play();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ": " + ex.StackTrace, "Error");
}
这里使用添加的资源来建立一个SoundPlayer类的实例,然后调用它的Play方法播放文件一次。
循环播放:
try
{
SoundPlayer player = new
SoundPlayer(EmbeddingWavFiles.Properties.Resources.sound2);
if (btnLoopPlay.Text == ("播放"))
{
player.PlayLooping();
btnLoopPlay.Text = "停止";
}
else
{
player.Stop();
btnLoopPlay.Text = "播放";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ": " + ex.StackTrace, "Error");
}
{
SoundPlayer player = new
SoundPlayer(EmbeddingWavFiles.Properties.Resources.sound2);
if (btnLoopPlay.Text == ("播放"))
{
player.PlayLooping();
btnLoopPlay.Text = "停止";
}
else
{
player.Stop();
btnLoopPlay.Text = "播放";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ": " + ex.StackTrace, "Error");
}
这里调用PlayLooping方法循环播放文件,可以调用Stop方法停止播放。
示例中在建立SoundPlayer的实例时,构造函数的参数类型是System.IO.UnmanagedMemoryStream,除此之外,重载的构造函数还接受字符串,该字符串表示要加载的wave文件的位置。
总结
这个示例演示了如何将音频文件嵌入到应用程序的资源文件并播放它们,这要用到System.Media类库。类似的功能也可通过引用”winmm.dll”来实现,但本文的方法需要的代码更少,从部署的角度来说也更为安全。By Anders
参考原文:http://www.c-sharpcorner.com/UploadFile/scottlysle/embedwavs01072007051701AM/embedwavs.aspx
示例下载:PlayWaveFiles.rar