基于.NET的Windows窗体编程之WinForms音频控件
在实际应用开发中有时候不仅需要文本提示还需要语音提示比如当系统异常时播放蜂鸣提示音以起到警示作用。合理的播放音频还可以起到事半功倍的效果今天我们以一些简单的小例子简述基于.NET的Windows窗体编程中音频控件的相关应用仅供学习分享使用如有不足之处还请指正。概述在WinForms开发框架中与音频相关的控件主要有2个SoundPlayer主要用于播放wav格式的音频文件它可以指定音频播放文件以及控制文件的播放和停止。SystemSounds系统提示音主要用于获取由Windows操作系统定义的声音类型。每一个声音类型为SystemSound类型仅提供了系统声音的播放功能。SoundPlayerSoundPlayer控件主要用于在应用程序中播放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以及订阅相应的事件如下所示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方法如下所示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方法如下所示private void btnStopPlay_Click(object sender, EventArgs e) { _soundPlayer.Stop(); }循环播放在Form表单中添加按钮并命名为btnPlayLooping然后在按钮的Click事件中通过OpenFileDialog打开文件对话框选择需要播放的wav文件并将文件路径赋值给SoundPlayer的SoundLocation属性然后调用PlayLooping方法如下所示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维护系统提示音调用方式如下所示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类如下所示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 namemp3filemp3文件路径/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格式文件如下所示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音频控件》的全部内容希望可以一起学习共同进步