如何在 WPF 中播放MP3和WAV?这三招全搞定

133 阅读3分钟

1、前言

在WPF应用程序开发中,音频播放是一个常见需求,无论是用于提示音、背景音乐,还是多媒体应用中的音频功能,选择合适的播放方式至关重要。不同的场景对音频格式、播放控制、资源管理等方面有不同的要求。本文将介绍三种在WPF中常用的音频播放方案:SoundPlayer、NAudio 和 MediaElement,分析它们的优缺点,并结合代码示例帮助开发者根据实际需求做出合适的选择。

2、正文

在实际开发中,我们常常需要为应用添加声音反馈或背景音乐。WPF提供了多种实现方式,每种方式都有其适用场景和技术特点。下面将逐一介绍这三种主流的音频播放方法。

3、内容

SoundPlayer

第一种方式是使用 .NET 平台自带的 SoundPlayer 类。
优点:无需引入第三方库,使用非常简单,适合播放简短的WAV格式音效。
缺点:仅支持WAV格式,不支持MP3等常见音频格式,功能较为基础。

示例代码:

SoundPlayer player = new SoundPlayer("BLOW.WAV");
player.Play();

NAudio

NAudio 是 .NET 平台上广泛使用的音频处理库,功能强大且灵活。
优点:支持多种音频格式(如MP3、WAV等),可以精细控制播放流程。
缺点:需要手动管理播放状态,例如播放、暂停、停止等逻辑需自行维护。

安装方式:

Install-Package NAudio

示例代码:

using NAudio.Wave;

namespace CodeKeeper.Controllers;

public class SoundController
{
    private FileStream ms;
    private Mp3FileReader rdr;
    private WaveStream wavStream;
    private BlockAlignReductionStream baStream;
    private WaveOut waveOut;
    private bool _isStop;

    public event EventHandler Stopped;

    public void Play(string fileName)
    {
        ms = File.OpenRead(fileName);
        rdr = new Mp3FileReader(ms);
        wavStream = WaveFormatConversionStream.CreatePcmStream(rdr);
        baStream = new BlockAlignReductionStream(wavStream);
        waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback());
        waveOut.PlaybackStopped += (s, e) =>
        {
            if (_isStop)
                return;

            Stopped?.Invoke(s, e);
        };
        waveOut.Init(baStream);
        waveOut.Play();
        _isStop = false;
    }

    public void Stop()
    {
        if (waveOut == null)
            return;

        _isStop = true;
        waveOut.Stop();
    }

    public void Pause()
    {
        if (waveOut == null)
            return;

        if (waveOut.PlaybackState == PlaybackState.Playing)
        {
            waveOut.Pause();
        }
    }

    public void Restart()
    {
        if (waveOut == null)
            return;

        if (waveOut.PlaybackState == PlaybackState.Paused)
        {
            waveOut.Resume();
        }
    }
}

MediaElement

WPF 自带的 MediaElement 控件,可用于播放音频和视频。
支持的音频格式包括 WAV、MP3、WMA;视频方面支持 AVI、MP4 等常用格式,复杂格式可能需要额外解码器。
优点:功能成熟,状态管理由框架自动处理,例如在窗体关闭时自动停止播放。
缺点:属于UI控件,虽然可以通过设置 Visibility="Collapsed" 隐藏界面,但仍需在XAML中声明。

前台代码:

<MediaElement
    x:Name="mediaPlayer"
    LoadedBehavior="Manual"
    Visibility="Collapsed"
    Volume="1" />

后台代码:

// 播放
_mediaPlayer.Source = new Uri(fileName);
_mediaPlayer.Play();

// 停止播放
_mediaPlayer.Stop();

4、总结

对于简单的短音频播放(如系统提示音),若仅使用WAV格式,SoundPlayer 是最轻量、最直接的选择。
若需要支持MP3等格式,并希望有更多控制能力,NAudio 是一个强大且灵活的第三方库,适合需要自定义播放逻辑的场景。
而对于需要长时间播放、涉及播放状态管理(如暂停、继续)或与UI生命周期联动的应用,推荐使用 MediaElement,它由WPF框架统一管理,稳定性高,开发效率也更高。

根据项目需求选择合适的播放方式,既能保证功能实现,也能提升开发体验和应用性能。

关键词:WPF、音频播放、SoundPlayer、NAudio、MediaElement、MP3播放、WAV、播放控制、后台播放、多媒体

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:wzwyc

出处:cnblogs.com/wzwyc/p/18439182

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!