音乐的随机播放

刚刚测试了一下android系统下三个音乐播放器关于随机播放音乐的实现方式:QQ音乐,小米的音乐播放器,以及百度音乐。

把播放模式设定为随机播放,播放存在手机的上的音乐列表。经过测试,大概分析出了3个播放器各自随机播放的实现。

1. 小米的音乐播放器
小米音乐的随机算法:在进入一个列表的时候,一组随机数就已经生成,然后音乐播放的循序就是按随机数进行的。
比如现在有5首歌曲,开始播放的时候生成了一个5,2,1,4,3这样的随机数组,然后顺序取歌曲播放就行了,小米的随机算法一定是这样的。因为你按向左播放(也就是播放前一首歌曲的时候),就会播放上一首播放的,而不是随机抽取的一首歌。这样本来是没有问题的,但是当这5首歌曲已经随机播放完了以后,继续播放的时候的随机顺序还是5,2,1,4,3。一直这样循环下去。我作为一个用户,希望的随机播放绝不是这样的。
小米音乐的随机算法,需要占用额外的内存(歌曲数目*sizeof(int)字节),这个内存消耗是可以接受的。而百度音乐和QQ音乐是得到随机数以后直接去播放音乐,没有这个内存消耗。
2. 百度音乐(版本v2.3.0)
百度音乐的随机很简单,就是每次播放一首歌曲的时候随机生成一个小于歌曲的整数,然后播放对应的歌曲就行了。这样会有以下问题
比如现在还是5首歌曲,它的播放可能会是5,2,5,2,4,5。。。每首歌曲播放的概率是一样的,理论上当播放的次数多了以后,每首歌曲被播放的次数是相等的,但是分布不一定是均匀的。也就是用户可能随机了几次以后都在同样几首歌曲上跳跃。同样我觉得这样的随机播放也不是很好的用户体验。
3. QQ音乐(版本2.4.0.1588)
QQ音乐的随机播放和百度音乐是一样的方式。
关于什么是一个理想的音乐列表随机播放的问题,简单做了一下调研,5个人有4个人希望的随机播放方式为:小米音乐的改进版,即当第一遍把所有的5首歌曲都随机播放完了以后,再重新生成一个随机播放序列,并按新的随机序列播放。改进就是设定一个bool数组,每播放一首歌曲,把数组对应的值设定为true,并且测试bool数组是否全为true。如果全为true,就生成新的随机序列,进行播放。
<think>好的,用户想用编程语言编写音乐顺序播放的功能代码,特别是顺序播放。我需要先确定用户使用的编程语言。之前的对话历史中,用户提到了参考引用[1],里面是关于C#和Windows Forms开发音乐播放器的内容。所以很可能用户现在也是想用C#来实现这个功能。 接下来,我需要考虑如何设计顺序播放的逻辑。顺序播放通常是指播放完当前歌曲后自动播放列表中的下一首,当到达最后一首时停止或循环到第一首。在C#中,可以使用Windows Media Player的控件或者NAudio库来处理音频播放。不过根据引用中的例子,用户可能更熟悉使用Windows Forms和WMP控件。 首先,需要创建一个播放列表,可能用List<string>来存储文件路径。然后维护一个当前播放索引。当当前歌曲播放结束时,触发一个事件,比如axWindowsMediaPlayer的PlayStateChange事件,当状态变为MediaEnded时,增加索引并播放下一首。需要处理索引越界的情况,比如到达最后一首时停止或循环。 另外,用户可能需要界面上的控件,比如列表显示歌曲,按钮选择文件等。这部分在引用中的代码示例里已经有涉及,可以沿用类似的界面设计。 然后要确保代码示例正确使用事件处理,比如订阅PlayStateChange事件,并在事件处理函数中处理索引递增和下一首播放。同时,添加文件到播放列表的逻辑,比如使用OpenFileDialog选择多个文件,并添加到ListBox和playlist列表中。 还要注意异常处理,比如文件不存在的情况,或者播放列表为空时的处理。不过用户可能更关注核心功能的实现,所以示例代码可以简化这部分。 最后,测试代码是否能够顺利播放,并在歌曲结束时自动跳转下一首。确保顺序播放的逻辑正确,比如索引是否正确增加,是否在最后一首停止等。 总结步骤:创建播放列表和当前索引,处理播放结束事件,更新索引并播放下一首,界面控件绑定播放列表。需要参考用户之前提到的C#和Windows Forms示例,保持代码结构一致,方便用户理解。</think>### C#音乐顺序播放实现步骤 1. **创建播放列表结构** ```csharp private List<string> playlist = new List<string>(); private int currentIndex = 0; ``` 2. **初始化播放器控件** ```csharp // 在窗体设计器中拖放WMP控件并命名为axWindowsMediaPlayer private AxWMPLib.AxWindowsMediaPlayer axWindowsMediaPlayer; // 订阅播放状态改变事件 axWindowsMediaPlayer.PlayStateChange += new AxWMPLib._WMPOCXEvents_PlayStateChangeEventHandler(Player_PlayStateChange); ``` 3. **实现顺序播放核心逻辑** ```csharp private void Player_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e) { // 当播放结束时触发(状态码3表示播放结束) if (e.newState == 3) { if (currentIndex < playlist.Count - 1) { currentIndex++; PlayCurrent(); } else { // 可选:循环播放 // currentIndex = 0; // PlayCurrent(); } } } private void PlayCurrent() { if (playlist.Count == 0) return; try { axWindowsMediaPlayer.URL = playlist[currentIndex]; axWindowsMediaPlayer.Ctlcontrols.play(); } catch (Exception ex) { MessageBox.Show($"播放错误: {ex.Message}"); } } ``` 4. **添加文件到播放列表** ```csharp private void btnAdd_Click(object sender, EventArgs e) { OpenFileDialog openFile = new OpenFileDialog(); openFile.Multiselect = true; openFile.Filter = "音频文件|*.mp3;*.wav;*.wma"; if (openFile.ShowDialog() == DialogResult.OK) { playlist.AddRange(openFile.FileNames); listBoxPlaylist.DataSource = playlist.Select(Path.GetFileName).ToList(); } } ``` 5. **界面控件布局建议** - ListBox控件显示播放列表 - 添加/删除文件按钮 - 播放/暂停/停止控制按钮 - 进度条显示播放进度
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值