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(); } } }
关键修改说明
- 自动切换逻辑:初始化每个
SoundPlayer时绑定PlayCompleted事件,曲目播放完毕后自动触发切换下一首的操作。 - 索引同步:
PlayRandomSong方法中更新currentSoundPlayerIndex为随机选中的索引,确保后续暂停、跳过操作针对当前播放曲目。 - 代码优化:提取
AddSoundPlayer方法简化初始化流程,统一Random实例避免重复随机值问题。 - 功能说明:
SoundPlayer无原生暂停功能,Stop方法会直接终止播放,如需实现真正的暂停/继续,建议改用NAudio等专业音频库。
内容的提问来源于stack exchange,提问作者user22944802
相关产品推荐
相关产品推荐

