基于.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音频控件》的全部内容,希望可以一起学习,共同进步!!

相关推荐
绿浪19842 小时前
c# 结构体 能不能直接封送检测
开发语言·c#
新手unity自用笔记2 小时前
unity基于Socket的网络学习
网络·网络协议·学习·unity·c#·游戏引擎
见山是山-见水是水2 小时前
鸿蒙版 Flutter Video 视频播放组件:播放控制、全屏切换与倍速播放
flutter·音视频·harmonyos
界面开发小八哥3 小时前
界面控件DevExpress Blazor v26.1新版亮点 - Navigation(导航)
javascript·.net·界面控件·blazor·devexpress·ui开发
格林威3 小时前
C#图像像素放大:邻域平均、双线性插值实现像素放大的C#实现代码
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
Claire_884 小时前
从视频字幕到知识图谱:基于大语言模型的自动思维导图生成工具调研
语言模型·音视频·知识图谱
hz567894 小时前
视频会议远程终端选型要点与部署实践
硬件架构·音视频·信息与通信·智能硬件
乐橙开放平台4 小时前
监控开放平台是什么?从设备接入到视频能力开放一次讲清
网络·人工智能·音视频
诸神缄默不语4 小时前
如何在Win11系统中找到是哪个程序占用了指定端口
windows