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

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

相关推荐
小柯南敲键盘6 小时前
跨马翻译:AI批量图片翻译工具,跨境电商视频字幕翻译与智能抠图一体搞定
人工智能·python·音视频
智塑未来8 小时前
2026年音频博客制作工具体验分享:三款不同方向的选择
音视频
YCOSA20258 小时前
系统工具使用检测.exe (仅供娱乐)
python·microsoft
爱吃苹果的日记本9 小时前
数据结构第一课
c语言·数据结构·数据库·学习·c#
唐青枫10 小时前
C#.NET PInvoke 深入解析:封送、内存布局与原生互操作实战
c#·.net
kakakahahahaha11 小时前
Windows笔记本重装系统的4种路径和风险边界
windows·电脑·笔记本电脑·内容运营·软件需求·重装系统
TST-魚爷11 小时前
实测体验|易视讯会议音视频一体机智能发言跟踪功能
音视频
Android系统攻城狮12 小时前
Linux Gstreamer深度解析之gst_audio_format_build_integer调用流程与实战(十二)
linux·运维·服务器·音视频·车载音视频·gstreamer进阶
可乐鸡翅yeah_12 小时前
MPEG‑TS 分片 PTS/DTS 时间戳异常排错,HLS 音画不同步定位实战
运维·测试用例·音视频·媒体·m3u8
yywww13 小时前
GenHTTP on .NET 11 登顶HTTP Arena 多个榜单(这是何方神圣)
.net