Windows程序设计课程作业二:C#实现简单音乐文件解析播放

目录

1.作业内容

2.设计思路分析与难点

2.1搭建环境

2.2设计思路

2.3设计难点

3.窗体设计

4.代码实现

5.完整代码

6.总结


1.作业内容

编写一个C#程序,实现音乐文件的播放功能

要求1

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

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

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

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

要求2

1. 程序应能够播放ogg文件。

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

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

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

2.设计思路分析与难点

2.1搭建环境

        使用vs2022中的Windows窗体应用(.NET Framework)框架来进行项目的实现。

2.2设计思路

        1.窗体界面设计:使用vs2022工具箱中的控件来对构建使用界面。

        2.代码功能编写:使用openFileDialog来选择歌曲,然后对具体功能进行编写。

        3.异常处理:捕获并响应各种可能出现的错误,如文件不存在、文件读取错误等。

2.3设计难点

        1.不同格式文件的播放不同:mp3格式的文件和ogg格式的文件所使用的播放方式不同,所以需要使用两个不同的方法来实现。

        2.播放列表的循环播放:播放列表中最后一首歌结束之后应该从第一首重新播放,需要使用恰当的方法来进行歌曲播放的循环。

3.窗体设计

根据需求和功能分析,窗体布局应如下:

窗体中每个控件所实现的功能如下:

label:用来显示当前播放歌曲的名字。

ListBox:用来展示歌曲的播放列表。

axWindowsMediaPlayer:用来对当前播放的歌曲进行调控。

Button:用来进行选择歌曲,停止播放,下一曲和播放ogg文件的操作。

trackBar:用来调节音量。

4.代码实现

调用NAudio.Vorbis控件

当创建好的框架后,我们点击编译器最上方的项目选项,找到管理NuGet程序包选项。

然后搜索并安装NAudio

搜索并安装NAudio.Vorbis

在.cs文件的头文件中添加其调用语句。

using NAudio;
using NAudio.Wave;
using NAudio.Vorbis;

全局变量

string[] files;
List<string> localmusicList = new List<string> { };
private WaveOutEvent outputDevice;

这里我定义了三个全局变量,作用如下:

files:暂时存储选取音乐名

localmusicList:存储歌单列表

outputDevice:定义一个WaveOutEvent类型的变量,便与后续ogg文件的播放

选择歌曲

openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav;*.ogg";
openFileDialog1.Multiselect = true;

这里使用openFileDialog来打开我们所需要选取的文件,并且文件的类型限定为mp3,flac,wav,ogg类型。

localmusicList.Clear();
listBox1.Items.Clear();

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

在将歌单载入之前,先将原先的列表进行清空处理,以便我们在后续切换歌单(再次选择文件)的时候,旧歌单和新歌单不会叠加。

files = openFileDialog1.FileNames;
string[] array = files;

try
{
    foreach (string x in array)
    {
        if (File.Exists(x))
        {
            listBox1.Items.Add(x);
            localmusicList.Add(x);
        }
        else
        {
            // 文件不存在,可以记录日志或通知用户  
            MessageBox.Show($"文件 {x} 不存在。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}
catch(Exception ex)
{
    //捕获异常
    MessageBox.Show("发生了一个错误: "+ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

添加音乐名,并且将音乐名用遍历的方式存储到localmusiclistbox中。在添加的过程中使用try_catch来捕获异常并反馈给用户。

播放音乐

private void musicplay(string filesname)
{
    string extention=Path.GetExtension(filesname);

    if(extention==".ogg")
    {
        PlayOgg(filesname);
    }
    else
    {
        axWindowsMediaPlayer1.URL= filesname;
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }
}

ogg文件的播放使用函数PlayOgg播放(后面会说明),如果播放的音乐不是ogg类型的文件,我们只需要将单个文件名filename赋值给axWindowsMediaPlayer1中的URL属性,然后调用axWindowsMediaPlayer1中的方法播放就行。

暂停播放

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

暂停播放比较简单,只需要调用axWindowsMediaPlayer1中的方法进行停止播放即可。

下一曲

 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;

     }
 }

当播放列表中没有下一首音乐时,需要重新从第一首音乐播放,这里使用的方法是当检查到当前索引超出范围时,直接将它赋值为0,即可播放第一首音乐。

声音控制

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

这里将trackBar1与axWindowsMediaPlayer1的音量控制连接,从而通过trackBar1来进行音量调节。

播放ogg文件

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;


        listBox1.Items.Add(oggFilePath);
        localmusicList.Add(oggFilePath);


        listBox1.SelectedIndex = listBox1.Items.Count - 1;

        PlayOgg(oggFilePath);

        label1.Text = Path.GetFileNameWithoutExtension(oggFilePath);
    }
}

这里使用第四个控件来对ogg文件进行播放,但是播放进度无法显示,因为底部的是axWindowsMediaPlayer控件,显示不了ogg播放进度。如果需要显示ogg文件的播放进度则需要通过其他方式来进行展示,这里就不做演示了。

private void PlayOgg(string filename)
{
    try
    {
        axWindowsMediaPlayer1.Ctlcontrols.stop();
        outputDevice = new WaveOutEvent();

        // 加载OGG文件
        VorbisWaveReader reader = new VorbisWaveReader(filename);

        // 设置音频数据源并开始播放
        outputDevice.Init(reader);
        outputDevice.Play();
    }
    catch (Exception ex) 
    {
        MessageBox.Show("播放失败"+ex.Message);
    };
}

这里是函数PlayOgg的实现,也通过了try_catch的模块进行异常处理。

5.完整代码

巨山超里霸迪卡/Windows程序设计课程作业

6.总结

        使用C#创建的一个简易的音乐播放器,可以播放mp3和ogg类型的文件。总的来说,功能还是比较简单的,而且播放的文件类型也比较有限。通过这次作业,我觉得还是有很多值得学习的地方。

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值