惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
MyScale Blog
MyScale Blog
A
About on SuperTechFans
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
The Cloudflare Blog
F
Fortinet All Blogs
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
罗磊的独立博客
量子位
有赞技术团队
有赞技术团队
V
V2EX
Engineering at Meta
Engineering at Meta

博客园 - 老码识途呀

基于.NET的Windows窗体编程之WinForms自定义控件(1) 基于.NET的Windows窗体编程之WinForms滑块与上下控件 基于.NET的Windows窗体编程之WinForms文件监控 基于.NET的Windows窗体编程之WinForms图像控件 基于.NET的Windows窗体编程之WinForms提示控件 基于.NET的Windows窗体编程之WinForms时间控件 基于.NET的Windows窗体编程之WinForms图表控件 基于.NET的Windows窗体编程之WinForms输入与显示 基于.NET的Windows窗体编程之WinForms菜单工具栏 基于.NET的Windows窗体编程之WinForms打印 基于.NET的Windows窗体编程之WinForms对话框 基于.NET的Windows窗体编程之WinForms列表控件 基于.NET的Windows窗体编程之WinForms数据表格 基于.NET的Windows窗体编程之WinForms事件简介 基于.NET的Windows窗体编程之WinForms布局简介 基于.NET的Windows窗体编程之WinForms控件简介 基于.NET的Windows窗体编程之WinForms入门简介 推荐一款基于.NET和百度飞桨的OCR识别组件 新书速递,手把手教你WPF入门与开发 推荐一种并发线程中资源同步常用方法 推荐一种手动设置异步线程等待机制的解决方案 推荐一种异步线程执行过程中更新进度的方法 推荐一款基于.NET的进程间数据交互经典解决方案 推荐一款线程or进程间数据同步解决方案 推荐一款代码规范检查(CodeReview)神器 推荐一款高性能状态机管理解决方案 推荐一款进程间高速交换数据的解决方案 推荐一款基于.NET的进程间通信框架 推荐一款基于EF-Core的分库分表利器 推荐一种程序崩溃闪退或卡死的分析方法
基于.NET的Windows窗体编程之WinForms音频控件
老码识途呀 · 2026-08-20 · via 博客园 - 老码识途呀

在实际应用开发中,有时候不仅需要文本提示,还需要语音提示,比如当系统异常时,播放蜂鸣提示音,以起到警示作用。合理的播放音频,还可以起到事半功倍的效果,今天我们以一些简单的小例子,简述基于.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音频控件》的全部内容,希望可以一起学习,共同进步!!