在实际应用开发中,有时候不仅需要文本提示,还需要语音提示,比如当系统异常时,播放蜂鸣提示音,以起到警示作用。合理的播放音频,还可以起到事半功倍的效果,今天我们以一些简单的小例子,简述基于.NET的Windows窗体编程中音频控件的相关应用,仅供学习分享使用,如有不足之处,还请指正。

概述
在WinForms开发框架中,与音频相关的控件主要有2个:
- SoundPlayer,主要用于播放wav格式的音频文件,它可以指定音频播放文件,以及控制文件的播放和停止。
- SystemSounds,系统提示音,主要用于获取由Windows操作系统定义的声音类型。每一个声音类型为SystemSound类型,仅提供了系统声音的播放功能。
SoundPlayer
SoundPlayer控件主要用于在应用程序中播放wav格式的音频文件,借助SoundPlayer,可以播放流式资源(Stream)或者 本地路径或 HTTP 位置中 .wav 格式的声音文件。
SoundPlayer的关键属性如下:
- SoundLocation,用于指定SoundPlayer播放的wav文件路径。
- LoadTimeout,加载超时时间,表示程序将在抛出异常之前等待加载声音的毫秒数。 默认值为 10 秒。
- IsLoadCompleted,表示声音是否已加载完毕。
SoundPlayer的关键方法如下:
- Load 方法 同步加载声音。
- LoadAsync 方法 开始异步加载声音。 加载完成后,它会引发 OnLoadCompleted 事件。
- Play 方法 在新线程中播放 SoundLocation 或 Stream 属性中指定的声音。
- PlaySync 方法 在当前线程中播放 SoundLocation 或 Stream 属性中指定的声音。
- Stop 方法 停止当前播放的任何声音。
SoundPlayer的关键事件如下:
- LoadCompleted 事件 尝试加载声音后引发。
- SoundLocationChanged事件,播放文件路径发生变化时触发。
- StreamChanged事件,播放文件Stream发生变化时触发。
SoundPlayer实例
创建Form表单,并命名为FrmSound,由于SoundPlayer控件默认不会显示在工具箱列表中,所以无法从工具箱拖动到Form表单中,需要手动创建,并在Form的Load事件中,初始化SoundPlayer,以及订阅相应的事件,如下所示:
cs
private SoundPlayer _soundPlayer;
public FrmSound()
{
InitializeComponent();
}
private void FrmSound_Load(object sender, EventArgs e)
{
_soundPlayer = new SoundPlayer();
_soundPlayer.LoadCompleted += SoundPlayer_LoadCompleted;
_soundPlayer.SoundLocationChanged += SoundPlayer_SoundLocationChanged;
}
private void SoundPlayer_SoundLocationChanged(object? sender, EventArgs e)
{
Debug.WriteLine(_soundPlayer.SoundLocation);
}
private void SoundPlayer_LoadCompleted(object? sender, AsyncCompletedEventArgs e)
{
if (_soundPlayer.IsLoadCompleted)
{
Debug.WriteLine("加载成功");
}
if (e.Cancelled)
{
Debug.WriteLine("取消加载");
}
Debug.WriteLine(e.UserState);
}
音频播放,在Form表单中添加按钮,并命名为btnPlayerAudio,然后在按钮的Click事件中,通过OpenFileDialog打开文件对话框,选择需要播放的wav文件,并将文件路径赋值给SoundPlayer的SoundLocation属性,然后调用Play方法,如下所示:
cs
private void btnPlayerAudio_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "WAV文件|*.wav";
openFileDialog.Title = "请选择需要打开的WAV文件";
if (DialogResult.OK == openFileDialog.ShowDialog())
{
string wavfile = openFileDialog.FileName;
_soundPlayer.SoundLocation = wavfile;
_soundPlayer.Play();
}
}
音频停止,在Form表单中添加按钮,并命名为btnStopPlay,在按钮的Click事件中,调用SoundPlayer的Stop方法,如下所示:
cs
private void btnStopPlay_Click(object sender, EventArgs e)
{
_soundPlayer.Stop();
}
循环播放,在Form表单中添加按钮,并命名为btnPlayLooping,然后在按钮的Click事件中,通过OpenFileDialog打开文件对话框,选择需要播放的wav文件,并将文件路径赋值给SoundPlayer的SoundLocation属性,然后调用PlayLooping方法,如下所示:
cs
private void btnPlayLooping_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "WAV文件|*.wav";
openFileDialog.Title = "请选择需要打开的WAV文件";
if (DialogResult.OK == openFileDialog.ShowDialog())
{
string wavfile = openFileDialog.FileName;
_soundPlayer.SoundLocation = wavfile;
_soundPlayer.PlayLooping();
}
}
SystemSounds
不仅可以通过SoundPlayer播放自定义音频文件,还可以通过SystemSounds 类播放常见的系统声音,包括蜂鸣声。SystemSounds是一个静态(static)类,共预定义了5维护系统提示音,调用方式,如下所示:
cs
private void btnSystemSound_Click(object sender, EventArgs e)
{
SystemSounds.Asterisk.Play();//星号声音
SystemSounds.Beep.Play();//beep
SystemSounds.Exclamation.Play();//感叹声音
SystemSounds.Hand.Play();
SystemSounds.Question.Play();
}
如果在播放时,没有系统听到相应的系统提示音,则可能是操作系统没有设置相应的声音,可以通过声音主题进行设置,如下所示:

或者通过系统,声音打开更多声音设置,如下所示:

MP3转换WAV
由于目前WAV格式的音频文件比较难下载,可以通过MP3音乐文件,转换为WAV格式进行测试验证SoundPlayer功能,具体步骤如下:
首先通过Nuget包管理器安装NAudio第三方库,如下所示:

为了方便调用,将MP3转换成WAV格式封装成独立的Helper类,如下所示:
cs
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.Formats.Tar;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Okcoder.WinForm.Demo
{
public class Mp3ToWavHelper
{
/// <summary>
/// MP3转换成WAV格式
/// </summary>
/// <param name="mp3file">mp3文件路径</param>
/// <returns></returns>
public static string Mp3ToWav(string mp3file)
{
string wavfile = mp3file.Replace(".mp3", ".wav");//生成输出的wav文件路径
using (Mp3FileReader reader = new Mp3FileReader(mp3file))
{
//第2步:使用CreatePcmStream方法获取wave流。
using (WaveStream pcmStream = WaveFormatConversionStream.CreatePcmStream(reader))
{
//第3步:用WaveFileWriter将波形数据写入文件。
WaveFileWriter.CreateWaveFile(wavfile, pcmStream);
}
}
return wavfile;
}
}
}
上述Helper类,主要是读取选择的MP3文件,然后转换为WaveStream流格式,然后再另存为wav格式的文件。
在Form表单中,增加按钮并命名为btnMp3ToWav,然后在按钮的Click事件中,将选择的MP3文件转换为WAV格式文件,如下所示:
cs
private void btnMp3ToWav_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "MP3文件|*.mp3";
openFileDialog.Title = "请选择需要打开的MP3文件";
if (DialogResult.OK == openFileDialog.ShowDialog())
{
string mp3file = openFileDialog.FileName;
string wavfile = Mp3ToWavHelper.Mp3ToWav(mp3file);
if (File.Exists(wavfile))
{
MessageBox.Show($"转换成功,WAV文件路径为:{wavfile}");
}
}
}
源码获取
关于本系列的完整代码,可以通过gitee上的库进行获取:https://gitee.com/ahsiang/winforms

以上就是《基于.NET的Windows窗体编程之WinForms音频控件》的全部内容,希望可以一起学习,共同进步!!