c#播放音乐文件

仓库地址: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的停止播放事件中

 

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值