编写一个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.mzph.cn/news/835006.shtml

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

相关文章

数据可视化训练第三天(富豪借钱问题可视化)

题目 一个穷人到富人那里去借钱&#xff0c;原以为富人不愿意&#xff0c;哪知富人一口答应了下来&#xff0c; 但提出了如下条件&#xff1a; 在30天中&#xff0c;富人第一天借给穷人1万元&#xff0c;第二天借给2万&#xff0c;以后每天所借的钱数都比上一天的多一万&…

C++数据结构——AVL树

前言&#xff1a;本篇文章将紧随二叉搜索树的节奏&#xff0c;分享一个新的数据结构——AVL树。 目录 一.AVL树概念 二.AVL树插入规则 三.AVL树实现 1.基本框架 2.插入 3.旋转 1&#xff09;左\右单旋 2&#xff09;左右/右左双旋 4.遍历 5.求树高度 6.判断平衡 7.…

仿真算法验证成功后,如何快速实现真机无缝切换?

Prometheus仿真优势 首先&#xff0c;我们先通过下面这个视频了解一下Prometheus仿真有哪些优势&#xff1a; 开源自主无人机平台重大更新&#xff01;Promethus仿真到真机无缝切换 Prometheus仿真最大的优势之一是采用了模块化设计&#xff0c;对每个操作节点进行了封装&…

影刀进行shopee商品排名零代码爬取

需要研究shopee平台的排名更新时间段和周期&#xff0c;几分钟用影刀写了一个爬取应用&#xff0c;每10分钟进行一次排名爬取&#xff08;以fan‘风扇’为例&#xff09;&#xff0c;0代码爬取。 打开’fan’关键词搜索网页&#xff1b;等待网页加载&#xff1b;滚动进一步加载…

如何使用Python为Excel文件添加预设文档属性和自定义文档属性

向Excel文件添加文档属性是专业地组织和管理电子表格数据的关键步骤。这些属性&#xff0c;如标题、作者、主题和关键词&#xff0c;增强了文件的元数据&#xff0c;使得在大型数据库或文件系统中跟踪、排序和搜索文档变得更加容易。通过包含这些信息&#xff0c;您不仅提高了文…

太牛了!360大佬编写的《应急响应指导手册》火了!(PDF限时3天领取)

免责声明&#xff1a; 请使用者遵守《中华人民共和国网络安全法》&#xff0c;由于传播、利用本账号所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;公众号及作者不为此承担任何责任。 简介 这份《应急响应指导手册》&#xf…

CSS跳动文字

<div class"loading-mask"><div class"loading-text"><span style"--i:1">加</span><span style"--i:2">载</span><span style"--i:3">中</span><span style"--i:…

android进阶-AIDL

参考&#xff1a;Android进阶——AIDL详解_android aidl-CSDN博客 AIDL&#xff08;Android 接口定义语言&#xff09;&#xff0c;可以使用它定义客户端与服务端进程间通信&#xff08;IPC&#xff09;的编程接口&#xff0c;在 Android 中&#xff0c;进程之间无法共享内存&…

Word设置代码块格式

前言 Word中无法像Markdown和LaTeX一样插入代码块&#xff0c;若要在Word中插入代码块可以手动设置代码块格式或自动粘贴代码块格式。若不追求完美高亮效果&#xff0c;可使用前者方案&#xff1b;若追求完美的高亮效果&#xff0c;可使用后者方案。下文介绍这2种方案。 手动…

C++ 多态的相关问题

目录 1. 第一题 2. 第二题 3. inline 函数可以是虚函数吗 4. 静态成员函数可以是虚函数吗 5. 构造函数可以是虚函数吗 6. 析构函数可以是虚函数吗 7. 拷贝构造和赋值运算符重载可以是虚函数吗 8. 对象访问普通函数快还是访问虚函数快 9. 虚函数表是什么阶段生成的&…

华为 Huawei 交换机 配置 Dot1q 终结子接口实现同设备 VLAN 间通信示例

组网需求 企业的不同部门拥有相同的业务&#xff0c;如上网、 VoIP 等业务&#xff0c;且各个部门中的用户位于不同的网段。目前存在不同的部门中相同的业务所属的VLAN 不相同&#xff0c;现需要实现不同VLAN中的用户相互通信。 如 图 7-7 所示&#xff0c;部门 1 和部门 2 中…

【拼多多笔试题汇总】2024-05-09-拼多多春招笔试题-三语言题解(Cpp/Java/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新拼多多近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f…

常见物联网面试题详解

物联网一直是非常火热的行业&#xff0c;G端如智慧城市、智慧工厂、智慧园区、智慧水利、智慧矿山等行业&#xff0c;都会涉及到物联网&#xff0c;基本都是软硬一体&#xff0c;因此当面试相关企业时&#xff0c;物联网平台是面试企业重点考察的项&#xff0c;小伙伴如果从事相…

前端使用Compressor.js实现图片压缩上传

前端使用Compressor.js实现图片压缩上传 Compressor.js官方文档 安装 npm install compressorjs使用 在使用ElementUI或者其他UI框架的上传组件时&#xff0c;都会有上传之前的钩子函数&#xff0c;在这个函数中可以拿到原始file&#xff0c;这里我用VantUI的上传做演示 a…

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

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

Docker快速搭建NAS服务——NextCloud

Docker快速搭建NAS服务——NextCloud 文章目录 前言NextCloud的搭建docker-compose文件编写运行及访问 总结 前言 本文主要讲解如何使用docker在本地快速搭建NAS服务&#xff0c;这里主要写如下两种&#xff1a; FileBrowser1&#xff1a;是一个开源的Web文件管理器&#xff…

idea运行项目报错提示:java: 错误: 不支持发行版本 19,让我来看看

在项目经常切换jdk时&#xff0c;这个error经常能遇到“不支持发行版本19”&#xff0c;这个问题修改起来其实很简单&#xff0c;但在真正操作到能够解决问题的那一步前&#xff0c;通常习惯先去查看配置的jdk版本是否是选择正确的&#xff0c;也就是先确认当前这个项目选择的j…

西湖大学英语听力考试音频无线发射系统-英语听力发射系统浅析

西湖大学英语听力考试音频无线发射系统-英语听力发射系统浅析 由北京海特伟业科技任洪卓发布于2024年5月10日 西湖大学&#xff0c;这所矗立于时代前沿的高等学府&#xff0c;始终秉持着创新精神和追求卓越的坚定信念&#xff0c;不断致力于教学质量的提升与学术研究的深化。其…

实体门店超-常规营销获客:218套落地方案/打造引流/锁客/复购/裂变营销

课程内容&#xff1a; 1 记住&#xff0c;生意不好不一定是你产品出了问题,mp4 2 生意人为什么要从产品思维向流量思维转型&#xff0c;社区超市每月多5万.mp4 3 实体老板不懂鱼塘理论只能等死&#xff0c;美业1招锁定275名年用户卡,mp4 4 餐饮赢销八部&#xff0c;帮你引爆…

MathType2024官方版数学公式编辑器功能全面介绍

在数字化学习和科研的浪潮中&#xff0c;数学公式的编辑与展示成为了不可或缺的一部分。MathType&#xff0c;作为一款专业的数学公式编辑器&#xff0c;凭借其强大的功能和便捷的操作&#xff0c;为科研人员、教师、学生等广大用户提供了极大的便利。下面&#xff0c;我们将对…