You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm中利用SoundPlayer实现音乐自动连播的方法

在C# WinForm中用SoundPlayer实现自动播放及曲目自动切换

你的需求是实现WAV嵌入资源的自动播放,曲目结束后自动切换下一首,同时保留现有播放、暂停、跳过功能。以下是修改后的完整代码及关键说明:

修改后的SoundPlayerManager.cs

using System;
using System.Collections.Generic;
using System.Media;
using System.Resources;

public class SoundPlayerManager
{
    private static SoundPlayerManager instance;
    private int currentSoundPlayerIndex = 0;
    private List<SoundPlayer> soundPlayers = new List<SoundPlayer>();
    private Random random = new Random(); // 统一实例化Random避免重复随机值问题

    private SoundPlayerManager()
    {
        InitializeSoundPlayers();
    }

    public static SoundPlayerManager GetInstance()
    {
        if (instance == null)
        {
            instance = new SoundPlayerManager();
        }
        return instance;
    }

    private void InitializeSoundPlayers()
    {
        // 添加所有嵌入资源的SoundPlayer,并绑定播放完成事件
        AddSoundPlayer(modding.Properties.Resources.all_girls_are_the_same);
        AddSoundPlayer(modding.Properties.Resources.armed_and_dangerous);
        AddSoundPlayer(modding.Properties.Resources.bad_boy);
        AddSoundPlayer(modding.Properties.Resources.bandit_og);
        AddSoundPlayer(modding.Properties.Resources.bottle);
        AddSoundPlayer(modding.Properties.Resources.coconut_mall);
        AddSoundPlayer(modding.Properties.Resources.final_battle);
        AddSoundPlayer(modding.Properties.Resources.flower_garden);
        AddSoundPlayer(modding.Properties.Resources.glock_handler);
        AddSoundPlayer(modding.Properties.Resources.gopro);
        AddSoundPlayer(modding.Properties.Resources.gourmet_race);
        AddSoundPlayer(modding.Properties.Resources.iron_on_me);
        AddSoundPlayer(modding.Properties.Resources.jeffrey);
        AddSoundPlayer(modding.Properties.Resources.nobody);
        AddSoundPlayer(modding.Properties.Resources.nuketown);
        AddSoundPlayer(modding.Properties.Resources.racks_in);
        AddSoundPlayer(modding.Properties.Resources.racks_out);
        AddSoundPlayer(modding.Properties.Resources.soda_pop);
        AddSoundPlayer(modding.Properties.Resources.spanglish);
        AddSoundPlayer(modding.Properties.Resources.stumblin);
        AddSoundPlayer(modding.Properties.Resources.toxic_humans);
        AddSoundPlayer(modding.Properties.Resources.wii_shop);
        // 原代码中有重复曲目,已移除,如需保留可自行添加
    }

    private void AddSoundPlayer(System.IO.Stream audioStream)
    {
        var player = new SoundPlayer(audioStream);
        // 绑定播放完成事件,触发自动切换下一首
        player.PlayCompleted += OnPlayCompleted;
        soundPlayers.Add(player);
    }

    private void OnPlayCompleted(object sender, EventArgs e)
    {
        // 播放完成后自动切换到下一首
        SkipToNextSong();
    }

    public void PlayRandomSong()
    {
        // 停止当前正在播放的曲目
        soundPlayers[currentSoundPlayerIndex].Stop();
        // 随机选择曲目并更新当前索引
        currentSoundPlayerIndex = random.Next(0, soundPlayers.Count);
        soundPlayers[currentSoundPlayerIndex].Play();
    }

    public void StopCurrentSong()
    {
        // 注意:SoundPlayer无原生Pause方法,Stop会直接终止播放并重置到开头
        soundPlayers[currentSoundPlayerIndex].Stop();
    }

    public void SkipToNextSong()
    {
        // 停止当前曲目
        soundPlayers[currentSoundPlayerIndex].Stop();
        // 循环切换到下一首
        currentSoundPlayerIndex = (currentSoundPlayerIndex + 1) % soundPlayers.Count;
        soundPlayers[currentSoundPlayerIndex].Play();
    }
}

修改后的Main.cs

using System;
using System.Windows.Forms;

namespace KeyAuth
{
    public partial class Main : Form
    {
        private SoundPlayerManager soundPlayerManager;

        public Main()
        {
            InitializeComponent();
            soundPlayerManager = SoundPlayerManager.GetInstance();
        }

        private void playButton_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Turn me up. A LOT!", "999");
            soundPlayerManager.PlayRandomSong();
        }

        private void pauseButton_Click(object sender, EventArgs e)
        {
            // 因SoundPlayer无原生Pause,用Stop替代,如需真正暂停需改用NAudio等库
            soundPlayerManager.StopCurrentSong();
        }

        private void skipButton_Click(object sender, EventArgs e)
        {
            soundPlayerManager.SkipToNextSong();
        }
    }
}

关键修改说明

  1. 自动切换逻辑:初始化每个SoundPlayer时绑定PlayCompleted事件,曲目播放完毕后自动触发切换下一首的操作。
  2. 索引同步:PlayRandomSong方法中更新currentSoundPlayerIndex为随机选中的索引,确保后续暂停、跳过操作针对当前播放曲目。
  3. 代码优化:提取AddSoundPlayer方法简化初始化流程,统一Random实例避免重复随机值问题。
  4. 功能说明:SoundPlayer无原生暂停功能,Stop方法会直接终止播放,如需实现真正的暂停/继续,建议改用NAudio等专业音频库。

内容的提问来源于stack exchange,提问作者user22944802

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:00:02