C#使用SoundPlayer类同步与异步播放WAV文件

江岸
江岸
发布时间:2026-10-14| 5人浏览过
原创

在.NET开发中,播放本地WAV音频通常使用 System.Media.SoundPlayer。为了规范操作并避免重复代码,可以通过封装一个静态工具类来实现同步播放、异步加载播放以及停止播放功能。

核心逻辑与准备

操作WAV音频文件主要依赖 System.Media 命名空间下的 SoundPlayer 类。该类提供了 LoadAsync()(异步加载)、PlaySync()(同步播放)和 Play()(异步播放)等方法。在使用前,请确保引用了正确的 DLL 库。

实现步骤

第1步:创建多媒体处理公共类

目的:构建一个可复用的 MediaHandler 类,内部包含对 SoundPlayer 的封装方法,支持传入文件路径或现有的 SoundPlayer 实例。

关键代码说明:

  • syncPlayWAV:用于阻塞当前线程直到播放完成,适用于需要等待音效结束的场合。
  • aSyncPlayWAV:立即返回主线程控制权,适合背景音乐或非强制同步的音效。
  • stopWAV:安全停止正在进行的音频播放。
using System;
using System.Media;

namespace DotNet.Utilities
{
  /// <summary>
  /// 处理多媒体的公共类
  /// </summary>
  public class MediaHandler
  {
    #region 同步播放wav文件
    /// <summary>
    /// 以同步方式播放wav文件 (重载:传入实例)
    /// </summary>
    public static void SyncPlayWAV(SoundPlayer sp, string wavFilePath)
    {
      try
      {
        //设置wav文件的路径
        sp.SoundLocation = wavFilePath;
        //使用异步方式加载wav文件到内存
        sp.LoadAsync();
        //检查是否加载完成
        if (sp.IsLoadCompleted)
        {
          //使用同步方式播放
          sp.PlaySync();
        }
      }
      catch (Exception ex)
      {
        throw new Exception("同步播放失败: " + ex.Message);
      }
    }
    /// <summary>
    /// 以同步方式播放wav文件 (重载:直接传入路径)
    /// </summary>
    public static void SyncPlayWAV(string wavFilePath)
    {
      try
      {
        //创建一个SoundPlayer对象,并设置wav文件的路径
        SoundPlayer sp = new SoundPlayer(wavFilePath);
        //使用异步方式加载wav文件
        sp.LoadAsync();
        //确认加载成功后再播放
        if (sp.IsLoadCompleted)
        {
          sp.PlaySync();
        }
      }
      catch (Exception ex)
      {
        throw new Exception("同步播放初始化失败: " + ex.Message);
      }
    }
    #endregion

    #region 异步播放wav文件
    /// <summary>
    /// 以异步方式播放wav文件 (重载:传入实例)
    /// </summary>
    public static void ASyncPlayWAV(SoundPlayer sp, string wavFilePath)
    {
      try
      {
        sp.SoundLocation = wavFilePath;
        sp.LoadAsync();
        if (sp.IsLoadCompleted)
        {
          //异步播放,不阻塞当前线程
          sp.Play();
        }
      }
      catch (Exception ex)
      {
        throw new Exception("异步播放失败: " + ex.Message);
      }
    }
    /// <summary>
    /// 以异步方式播放wav文件 (重载:直接传入路径)
    /// </summary>
    public static void ASyncPlayWAV(string wavFilePath)
    {
      try
      {
        SoundPlayer sp = new SoundPlayer(wavFilePath);
        sp.LoadAsync();
        if (sp.IsLoadCompleted)
        {
          sp.Play();
        }
      }
      catch (Exception ex)
      {
        throw new Exception("异步播放初始化失败: " + ex.Message);
      }
    }
    #endregion

    #region 停止播放wav文件
    /// <summary>
    /// 停止当前的音频播放
    /// </summary>
    public static void StopWAV(SoundPlayer sp)
    {
      if (sp != null)
      {
        sp.Stop();
      }
    }
    #endregion
  }
}

使用注意事项

  • 加载状态判断:SoundPlayer 是异步设计的,必须调用 LoadAsync() 并通过 IsLoadCompleted 判断加载完成后,再进行播放,否则可能因文件未就绪而无声或报错。
  • 异常处理:在实际项目中建议捕获具体异常,上述代码简化了错误信息传递。
  • 资源释放:SoundPlayer 实现了 IDisposable 接口,建议在不再需要时将其置于 using 语句块中,以便及时释放非托管音频资源。

以上就是 C# 使用 SoundPlayer 类实现 WAV 文件同步与异步播放的详细内容,更多关于 C# 音频处理的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。