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

一、作业要求

要求1:

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

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

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

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

提示:此功能可以使用WindowsMediaPlayer控件

要求2:

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

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

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

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

提示:此功能可以使用Nuget程序包中的Naudi.Vorbis控件

二、具体实现

1、架构选择

考虑到要求中的“对用户界面友好”和“跨版本兼容性”,我们选择visual studio 2022中的windows Forms(.NETFramework)作为项目。

2、界面设计

根据题目要求选择需要的控如下:

OpenFileDialog:使用户选择音频文件,根据文件扩展名调用相应的播放器对象进行播放,可以选择播放开始,暂停,停止。

listbox:作为显示选中的音乐播放列表

label:显示当前播放的音乐

axWindowsMediaPlayer:专门使用WindowsMediaPlayer控件做音乐播放。

trackBar:作为一个音量控制器

button:作为多个对音乐操作控制的按钮触发事件

ps:为了美化一点界面我还插入了图片

结果如下:

3、代码实现

3.1 类成员变量定义

//选择音乐文件
string[] files;
List<string > localmusiclist=new List<string> { };
private VorbisWaveReader currentVorbisReader;

3.2 “选择歌曲”按钮

private void button1_Click(object sender, EventArgs e)
{openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav";//先过滤,选择我要的文件openFileDialog1.Multiselect = true;//多选属性,打开文件对话框,可以同时选择多个我要的文件if(openFileDialog1.ShowDialog() == DialogResult.OK)//对话框'ok'='选择确定'{localmusiclist.Clear();listBox1.Items.Clear();//清控件,把文件放进播放器,但是要先清空,以免上次的结果影响这次if (files != null){Array.Clear(files,0, files.Length);//清文件,把上一次的结果清空}files= openFileDialog1.FileNames;//所有符合要求的文件的文件名string[] array = files;//这些文件名分别作为字符串作为array数组的每一元素foreach(string file in array ){listBox1.Items.Add(file);//列表项,返回int值的下标localmusiclist.Add(file);//歌单,是string 的列表形式}}
}

3.3 listbox1显示播放音乐列表

//显示播放音乐的列表
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)//listbox1的事件响应
{if(localmusiclist.Count>0)//判断歌单有没有各歌{//把索引号放过来axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex];//[]内需要一个int类型的索引// axWindowsMediaPlayer1.Ctlcontrols.play()这里为了可以处理多种类型的文件二写成一个处理函数yytmusicplayer(axWindowsMediaPlayer1.URL);label1.Text =Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]);//把正在播放的歌曲名字放出来,传入大参数是被选中的歌}
}

3.4 控制音量大小

//控制划尺大小和音量有关
private void trackBar1_Scroll(object sender, EventArgs e)
{//设置值axWindowsMediaPlayer1.settings.volume=trackBar1.Value;//value是当前的值}

3.5 “停止播放”按钮

//停止播放
private void button2_Click(object sender, EventArgs e)
{axWindowsMediaPlayer1.Ctlcontrols.stop();
}

3.6 “循环播放”按钮

//循环播放
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];yytmusicplayer(axWindowsMediaPlayer1.URL);label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);listBox1.SelectedIndex = index;}
}

3.7 单独处理播放ogg文件,“播放ogg”按钮

 //播放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;}// string oggFilePath = @"C:\path\to\your\file.ogg"; // 替换为您的OGG文件路径  using (var vorbisReader = new VorbisWaveReader(oggFilePath)){using (var outputDevice = new WaveOutEvent()){outputDevice.Init(vorbisReader);outputDevice.Play();while (outputDevice.PlaybackState == PlaybackState.Playing){System.Threading.Thread.Sleep(1000);}}// 等待播放完成,或可以根据需要添加其他逻辑  using (var vorbisStream = new VorbisWaveReader(oggFilePath)){using (var outputDevice = new WaveOutEvent()){outputDevice.Init(vorbisStream);outputDevice.Play();//Console.WriteLine("Press any key to stop playback...");//Console.ReadKey();//outputDevice.Stop();while (outputDevice.PlaybackState == PlaybackState.Playing){System.Threading.Thread.Sleep(1000);}}}}}

四、完整代码

代码仓库:Windows程序设计作业: 放作业

五、总结

在完成这次作业的过程中,我深入了解了音频文件的播放和异常处理的相关知识,同时也对C#的Windows Forms应用程序开发有了更实际的操作体验。

以下是我具体的掌握方面:

  1. 音频文件播放
    • 我首先学习了如何使用Windows Media Player控件来播放MP3文件。这一过程中,我掌握了如何在Windows Forms应用程序中添加控件、设置控件属性以及调用控件的方法来播放音频。
    • 为了满足播放ogg文件的需求,我学习了如何通过NuGet程序包管理器安装并使用第三方库(如Naudi.Vorbis),锻炼了我处理外部依赖的能力。
  2. 异常处理
    • 在处理音频文件播放的过程中,我意识到了异常处理的重要性,需要考虑并处理文件不存在、文件读取错误等异常情况。
  3. 用户界面设计
    • 在设计用户界面时,我注重了用户体验和操作的便捷性。通过合理布局控件、设置控件样式和添加必要的交互功能,我创建了一个直观易用的音频播放界面。
    • 这一过程锻炼了我对Windows Forms控件的使用能力,也让我更加熟悉了界面设计的原则和技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/685606.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车载测试系列:自动驾驶中间件SOME/IP

一、以太网引入汽车 2004年&#xff0c;宝马汽车的OBD诊断口采用的是高速CAN总线&#xff0c;速率为500kbit/s&#xff0c;除去CAN协议本身的开销&#xff0c;通过OBD口升级控制器的净升级速度降到200kbit/s。预计到2008年&#xff0c;软件更新的数据量会达到1GB&#xff0c;按…

【ARM Cortex-M3指南】3:Cortex-M3基础

文章目录 三、Cortex-M3基础3.1 寄存器3.1.1 通用目的寄存器 R0~R73.1.2 通用目的寄存器 R8~R123.1.3 栈指针 R133.1.4 链接寄存器 R143.1.5 程序计数器 R15 3.2 特殊寄存器3.2.1 程序状态寄存器3.2.2 PRIMASK、FAULTMASK和BASEPRI寄存器3.2.3 控制寄存器 3.3 操作模式3.4 异常…

同时安装多个nodejs版本可切换使用,或者用nvm管理、切换nodejs版本(两个详细方法)

目录 一.使用nvm的方法&#xff1a; 1.卸载nodejs 2.前往官网下载nvm 3.安装nvm 4.查看安装是否完成 5.配置路径和淘宝镜像 6.查看和安装各个版本的nodejs 7.nvm的常用命令 二.不使用nvm&#xff0c;安装多个版本&#xff1a; 1.安装不同版本的nodejs 2.解压到你想放…

新能源 锂电池行业创业的财富方案,锂电池回收实战攻略课(36节课)

实战攻略 12年锂电池回收行业经验与坑全收录 课程内容&#xff1a; 001-课程介绍.mp4 002-锂电池的全种类认识.mp4 003-废品锂电池到级片粉末价值估算,mp4 004-锂电池的生产应用回收,mp4 005-梯次回收到粉未提纯全流程,mp4 006-锂电池行业术语,mp4 007-回收所需必备工具…

5.Git

Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、xml文件、html文件等&#xff09;。通过Git仓库来存储和管理这些文件&#xff0c;Git仓库分为两种 本地仓库&#xff1a;开发人员自己电脑上的Git仓库远程仓库&#xff1a;远程…

npm run build 时出现语法报错 Module parse failed: Unexpected token

错误原因 出现这个错误一般是你使用了或者引用的包里出现了ES6的语法&#xff0c;但是你的webpack可能是4.x或者更低版本的&#xff0c; 这时候单靠webpack本身无法识别ES6的语法&#xff0c;但是升级webpack到5可能会与现有的代码产生兼容性问题&#xff0c;因此就需要引入b…

学习网络需要认识的各种设备

网桥&#xff08;bridge&#xff09; 网桥工作在数据链路层&#xff0c;可以把多个局域网连接起来&#xff0c;组成一个更大的局域网 以太网中&#xff0c;数据链路层地址就是mac地址&#xff0c;网桥与集线器的区别就是&#xff0c;网桥会过滤mac&#xff0c;只有目的mac地址…

Python远程连接Linux执行操作

一、任务要求 要使用Python编写代码来远程给Linux主机上传一个文件&#xff0c;可以使用paramiko库&#xff0c;这是一个实现了SSHv2协议的Python库&#xff0c;它支持SSH连接&#xff08;包括客户端和服务端&#xff09;&#xff0c;并且提供SFTP&#xff08;SSH File Transf…

如何创建window11虚拟机,超详细!!!

为什么要创建window11虚拟机&#xff0c;有了虚拟机&#xff0c;可以避免一些软件的危害&#xff0c;我们可以在虚拟机里&#xff0c;测试软件的安全性。当然你也可以在虚拟机里体验下流氓软件带来的快乐。众所周知&#xff0c;流氓软件会修改默认浏览器&#xff0c;将几款流氓…

财务管理|基于SprinBoot+vue的财务管理系统(源码+数据库+文档)

财务管理系统 目录 基于SprinBootvue的财务管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 1管理员功能模块 2员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1…

孔板流量计和孔板流量计真的不一样

孔板流量计和孔板流量计真的不一样&#xff0c;无论您是追求品质&#xff0c;还是注重实用功能&#xff0c;我们的产品都能让您心动不已。让您轻松享受到现代科技所带来的便利&#xff0c;尽情展现自己不一样的魅力。 用途【1-5-9】 孔板流量计为煤矿瓦斯抽放而设的计算瓦斯抽…

linux grep命令搜索指定路径

在Linux开发的过程中grep这个搜索命令&#xff0c;是必不可少的存在。它可以快速的搜索出来我们需要的关键字所在的位置。 有助于我们快速分析定位问题。 下面&#xff0c;分享一个简单实用的小技巧。 原始grep 最终grep grep过滤掉二进制的文件 -I选项 结论 这样子是不…