Windows程序设计作业2--编写一个C#程序,实现音乐文件的播放功能

1.作业要求

1. 程序应能够读取MP3和ogg文件,并播放其中的音频。

2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。

3. 程序应具有良好的用户界面,方便用户进行操作。

4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行

2.设计思路

选择Windows Forms作为开发平台,使用工具箱中的控件来构造用户界面,使用OpenFileDialog允许用户选择音频文件,并进行播放。 播放控制例如开始、暂停。

3.窗体设计

1ec8ae5b1d8e42c0a3379f7861a19591.png

控件功能

Label:展示当前播放的歌曲。
ListBox:展示选择的歌曲列表。
AxWindowsMediaPlayer:用于播放音乐。
OpenFileDialog:选择音乐
Button:选择歌曲文件、停止播放、下一曲的功能实现。
TrackBarl:音量控制

4.代码展示

4.1类成员的定义


List<string> localmusiclist = new List<string> { };
OpenFileDialog openFileDialog = new OpenFileDialog();
 using (var waveOut = new WaveOutEvent())

localmusiclist用来存储歌曲,openfiledialog用来播放mp3音频,waveout用来播放ogg文件。

4.2mp3音乐播放

4.2.1代码结构

private void button1_Click(object sender, EventArgs e)
{
    openFileDialog1.Filter = "选择音频|*.mp3;";
    openFileDialog1.Multiselect = true;
    if (openFileDialog1.ShowDialog() == DialogResult.OK)//清控件
    {
        listBox1.Items.Clear();

        if (files != null)
        {
            Array.Clear(files, 0, files.Length);//清文件
        }

        files = openFileDialog1.FileNames;
        string[] array = files;
        foreach (string x in array)
        {
            listBox1.Items.Add(x);
            localmusiclist.Add(x);
        }


    }

}

4.2.2具体实施

ae7f3eb2b7d84a5ca0a6f365c404089d.png

 

4.3音乐停止

调用了axWindowsMediaPlayer1控件的Ctlcontrols.stop()方法来停止当前正在播放的媒体。这是使用ActiveX Windows Media Player控件来停止媒体播放的标准方法。

 private void button2_Click(object sender, EventArgs e)
 {
     axWindowsMediaPlayer1.Ctlcontrols.stop();
 }

4.4下一首音乐

用索引来得到下一首音乐URL,再进行播放,更改Label的信息显示与SelectedIndex的当前索引。且在索引大于当前音乐列表的时候,将Index重置为零,从而实现循环播放功能。

private void button3_Click(object sender, EventArgs e)
{
    if (localmusiclist.Count > 0)
    {
        int index = listBox1.SelectedIndex + 1;
        if (index >= localmusiclist.Count())
        {
            index = 0;
        }

        axWindowsMediaPlayer1.URL = localmusiclist[index];
        musicplay(axWindowsMediaPlayer1.URL);
        label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);

        listBox1.SelectedIndex = index;

    }

4.5音量大小控制

TrackBar个设置了axWindowsMediaPlayer的音量。axWindowsMediaPlayer1.settings.volume属性用于获取或设置媒体播放器的音量。

private void trackBar1_Scroll(object sender, EventArgs e)
{
    axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}

4.6ogg文件的播放

4.6.1代码结构

 private void button4_Click(object sender, EventArgs e)
 {
     OpenFileDialog openFileDialog = new OpenFileDialog();
     openFileDialog.Filter = "打开音频|*.ogg";

     string oggFilePath = "";

     if (openFileDialog.ShowDialog() == DialogResult.OK)
     {
         oggFilePath= openFileDialog.FileName;
     }

     using (var vorbisReader = new VorbisWaveReader(oggFilePath))
     {
         // 创建一个WaveOutEvent实例来播放音频  
         using (var waveOut = new WaveOutEvent())
         {
             // 初始化WaveOutEvent实例,并设置其输入为VorbisFileReader  
             waveOut.Init(vorbisReader);

             // 开始播放音频  
             waveOut.Play();

             // 等待播放完成,或者可以添加其他逻辑,比如响应播放事件  
             while (waveOut.PlaybackState == PlaybackState.Playing)
             {
                 System.Threading.Thread.Sleep(100); // 等待一段时间,避免死循环  
             }

             // 播放完成后,停止并释放WaveOutEvent资源  
             waveOut.Stop();
             waveOut.Dispose();
         }

         // 释放VorbisFileReader资源  
         vorbisReader.Dispose();
     }
 }

4.6.2实施结果

84421734aa4849e8b5e812bc11ee375b.png

5.完整代码

using System.Diagnostics.Eventing.Reader;
using NAudio;
using NAudio.Wave;
using NAudio.Vorbis;
namespace WinFormsApp3
{
    public partial class Form1 : Form
    {
        string[] files;

        List<string> localmusiclist = new List<string> { };
        public Form1()
        {
            InitializeComponent();
        }
        private void musicplay(string filename)
        {
            axWindowsMediaPlayer1.URL = filename;

            string extension = Path.GetExtension(filename);

            if (extension == ".ogg") { Console.WriteLine("这是ogg文件。"); }
            else
            {
                axWindowsMediaPlayer1.Ctlcontrols.play();
            }
        }

        private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "选择音频|*.mp3;";
            openFileDialog1.Multiselect = true;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)//清控件
            {
                listBox1.Items.Clear();

                if (files != null)
                {
                    Array.Clear(files, 0, files.Length);//清文件
                }

                files = openFileDialog1.FileNames;
                string[] array = files;
                foreach (string x in array)
                {
                    listBox1.Items.Add(x);
                    localmusiclist.Add(x);
                }


            }

        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (localmusiclist.Count > 0)
            {
                axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex];
                musicplay(axWindowsMediaPlayer1.URL);
                label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]);

            }
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            axWindowsMediaPlayer1.Ctlcontrols.stop();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (localmusiclist.Count > 0)
            {
                int index = listBox1.SelectedIndex + 1;
                if (index >= localmusiclist.Count())
                {
                    index = 0;
                }

                axWindowsMediaPlayer1.URL = localmusiclist[index];
                musicplay(axWindowsMediaPlayer1.URL);
                label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);

                listBox1.SelectedIndex = index;

            }

        }

        private void button4_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "打开音频|*.ogg";

            string oggFilePath = "";

            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                oggFilePath= openFileDialog.FileName;
            }

            using (var vorbisReader = new VorbisWaveReader(oggFilePath))
            {
                // 创建一个WaveOutEvent实例来播放音频  
                using (var waveOut = new WaveOutEvent())
                {
                    // 初始化WaveOutEvent实例,并设置其输入为VorbisFileReader  
                    waveOut.Init(vorbisReader);

                    // 开始播放音频  
                    waveOut.Play();

                    // 等待播放完成,或者可以添加其他逻辑,比如响应播放事件  
                    while (waveOut.PlaybackState == PlaybackState.Playing)
                    {
                        System.Threading.Thread.Sleep(100); // 等待一段时间,避免死循环  
                    }

                    // 播放完成后,停止并释放WaveOutEvent资源  
                    waveOut.Stop();
                    waveOut.Dispose();
                }

                // 释放VorbisFileReader资源  
                vorbisReader.Dispose();
            }
        }
    }
}

6.作业总结

通过本次作业对c#中窗体控件掌握的更加深刻了,加强了拖过第三方库来调用控件之间的联系的能力。对c#学习更上一层楼。

7.改进思路

包含音乐格式播放的文件格式较少,只有mp3和ogg文件,更先进的例如mp4等无法播放。需进一步对此进行补充。

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值