在一个win Forms应用中嵌入以及播放WAV音频文件(翻译五)
在一个win Forms应用中嵌入以及播放WAV音频文件
背景
本文描述如何嵌入WAV音频文件到应用程序里面以及通过使用System.Media 类库来播放这些文件。由于使用了System.Media 类库,因此在此示例中不依赖于引用winmm.dll来播放音频文件。也就可以用更加少的代码来实现这个功能了
音频文件将会作为资源来嵌入到应用程序中,在安装中不再需要对外部WAV文件进行打包。同时应用嵌入资源可以消除应用程序被安装之后其外部所需文件被移走或被删除的潜在情况。
图1。简单应用程序中的示例窗体
开始
在下载的解决方案中包含一个名叫“PlayWavFiles”的项目。项目如解决方案管理器中所示(图2)。项目中只是包含一个win forms 应用程序中默认的引用;resources文件夹所示的就是被嵌入到应用程序中的资源,这些文件不会随着应用程序被打包到安装文件中。
图2 解决方案管理器
示例是通过Visual Studio 2005 用C#来写的;在IDE中打开解决方案检查代码。
添加音频文件资源
添加音频文件到解决方案中,打开在解决方案管理器中的Resources.resx文件。打开之后,你会看到一个列表(图3)。你可以通过这个列表来添加所选择类型的资源到项目中。在列表中选择音频文件选项,点击“添加资源”
图3 添加音频到资源中
一旦你点击“添加资源”按钮后,会打开一个文件浏览器。你可以用这个文件浏览器来找到你所需的音频文件并且添加到应用程序资源中。
图4 。 浏览音频文件
一旦音频文件已经被添加到应用程序资源中,选择所添加的项设置其“Persistence”属性为“Embedded in .resx”。
图5 设置被添加的音频文件的Persistence属性
现在,音频文件已经被添加以及设置;他们 可以在项目中使用。
代码:Main Form
在应用中只有一个的窗体(frmMain),窗体中包含播放嵌入音频文件所需的代码。另在,在默认被引用的类库中,System.Media类库也应该被添加到窗体中被引用。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Media;
namespace PlayWavFiles
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
在窗体中只有三个按钮点击事件处理,exit button用来关闭应用程序
private void btnExit_Click(object sender, EventArgs e)
{
Application.Exit();
}
第二个按钮点击事件用于播放嵌入的音频文件
private void btnDemo1_Click(object sender, EventArgs e)
{
try
{
SoundPlayer sndplayr = new
SoundPlayer(PlayWavFiles.Properties.Resources.BuzzingBee);
sndplayr.Play();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ": " + ex.StackTrace.ToString(), "Error");
}
}
点击事件中建立一个System.Media sound 的播放器实例,设置播放器从应用程序资源中加载一个音频文件。资源加载到播放器之后,播放器的播放函数会被调用,音频文件将会被播放。
下一个点击事件处理中,示例循环播放一个嵌入的音频文件。
private void btnDemo2_Click(object sender, EventArgs e)
{
try
{
SoundPlayer sndplayr = new
SoundPlayer(PlayWavFiles.Properties.Resources.LoopyMusic);
if (btnDemo2.Text == "Demo WAV 2")
{
sndplayr.PlayLooping();
btnDemo2.Text = "STOP";
}
else
{
sndplayr.Stop();
btnDemo2.Text = "Demo WAV 2";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ": " + ex.StackTrace.ToString(), "Error");
}
}
示例以同样简单的方式运行。最后的点击事件处理中调用“PlayLooping”而不是"Play" 。通过这个函数以及player的"Stop" 函数,音频文件将会被循环播放或停止播放。为了支持这个特性,当循环播放开始,按钮的文字将会变成"STOP",当用户点击"STOP"按钮,player的 "Stop"函数将会被调用,按钮的文字将会变成"Demo WAV 2"。点击按钮之后会循环播放或者停止播放并且更新按钮的文字。
上面就是关于播放嵌入音频文件的全部代码了。
摘要
示例描述了如何嵌入音频文件到应用程序的资源中,和如何利用System.Media类库来循环播放嵌入资源音频文件。类似的功能可以通过调用winmm.dll 来实现。然而示例中使用的代码更少,而且是安全的应用开发。