仓库地址:https://gitee.com/smartcarrot/musicplayer.git
ui界面
0.对象
private VorbisWaveReader voribisReader;
private WaveOutEvent waveOutEvent = new WaveOutEvent();
private string[] files;
private List<string> localMusicList = new List<string>();
voribisReader和waveOutEvent用于播放ogg文件
voribisReader用于读取文件流,使用时new,不用初始化
files和localMusicList用于存放文件列表
1.导入音频文件
openFileDialog1.Filter = "choose music|*.mp3;*.wav;*.flac;*.ogg";
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
listBox1.Items.Clear();
if (files != null)
{
Array.Clear(files, 0, files.Length);
}
files = openFileDialog1.FileNames;
var array = files;
foreach (var item in array)
{
listBox1.Items.Add(item);
localMusicList.Add(item);
}
}
2.绑定列表框的列表项改变事件 ,实现列表项改变时播放对应音乐
if (localMusicList.Count > 0)
{
//axWindowsMediaPlayer1.URL = localMusicList[listBox1.SelectedIndex];
Music_play(localMusicList[listBox1.SelectedIndex]);
label1.Text = Path.GetFileNameWithoutExtension(localMusicList[listBox1.SelectedIndex]);
}
private void Music_play(string filename)
{
string extension = Path.GetExtension(filename);
if (extension == ".ogg")
{
voribisReader = new VorbisWaveReader(filename);
//waveOutEvent = new WaveOutEvent();
waveOutEvent.PlaybackStopped += (s, a) =>
{
voribisReader?.Dispose();
};
try
{
waveOutEvent.Init(voribisReader);
waveOutEvent.Play();
}
catch (Exception ex)
{
MessageBox.Show("播放出错: " + ex.Message);
if (waveOutEvent.PlaybackState == PlaybackState.Playing)
{
waveOutEvent.Stop();
}
waveOutEvent.Dispose();
}
}
else
{
axWindowsMediaPlayer1.URL = filename;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
非ogg文件直接调用系统com组件axWindowsMediaPlayer播放
播放ogg文件需要先将流对象voribisReader建立,再调用waveoutevent对象播放 ,同时注册waveoutevent的停止播放事件,防止voribisReader的重复创建造成后台多重播放
3.停止按钮和下一曲按钮
private void Music_stop()
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
if(waveOutEvent.PlaybackState == PlaybackState.Playing)
{
waveOutEvent.Stop();
}
}
private void button2_Click(object sender, EventArgs e)
{
Music_stop();
}
//next
private void button3_Click(object sender, EventArgs e)
{
Music_stop();
if (localMusicList.Count > 0)
{
var index = listBox1.SelectedIndex + 1;
if (index >= localMusicList.Count)
{
index = 0;
}
//axWindowsMediaPlayer1.URL = localMusicList[index];
//Music_play(localMusicList[index]);
label1.Text = Path.GetFileNameWithoutExtension(localMusicList[index]);
listBox1.SelectedIndex = index;
}
}
点击下一曲按钮时先停止当前播放,再直接更改选择列表项。
(1)不需要调用播放方法,播放方法已注册在列表项更改事件中
(2)不需要调用销毁流对象voribisReader的dispose方法,已经注册在waveoutevent的停止播放事件中