基于.NET的Windows窗体编程之WinForms音频控件

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

image

 

概述

 

在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,以及订阅相应的事件,如下所示:

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();
}

 

如果在播放时,没有系统听到相应的系统提示音,则可能是操作系统没有设置相应的声音,可以通过声音主题进行设置,如下所示:

image

 

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

image

 

MP3转换WAV

 

由于目前WAV格式的音频文件比较难下载,可以通过MP3音乐文件,转换为WAV格式进行测试验证SoundPlayer功能,具体步骤如下:

首先通过Nuget包管理器安装NAudio第三方库,如下所示:

image

为了方便调用,将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 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格式文件,如下所示:

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

image

 

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

posted @ 2026-08-20 12:00  老码识途呀  阅读(6)  评论(0)    收藏  举报