编写一个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.mfbz.cn/a/610493.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VK6932 SOP32数码屏驱动IC抗干扰数显芯片高稳定LED驱动 原厂FAE支持

产品型号&#xff1a;VK6932 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP32 工程服务&#xff0c;技术支持&#xff01; 概述 VK6932是一种数码管或点阵LED驱动控制专用芯片&#xff0c;内部集成有3线串行接口、数据锁存器、LED 驱动等电路。SEG脚接LED阳…

【Python】selenium爬虫常见用法和配置,以及常见错误和解决方法

欢迎来到《小5讲堂》 这是《Python》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言无执行文件代码报错信息错误路径手动下载自动下载 选项配置Ch…

js之遍历方法

先创建一个数组&#xff0c;然后使用for.in进行遍历&#xff0c;如下图所示sub代表下标并且遍历几次&#xff0c;arr代表数组 <script>let arr [1, 2, 3, 4, 5, 6];for (let sub in arr) {console.log(arr);}</script> 第二种方法则是for循环遍历&#xff0c;根据…

Transformer 解析 超级详细版

推荐学习视频 汉语自然语言处理-从零解读碾压循环神经网络的transformer模型(一)- 注意力机制-位置编码-attention is all you need_哔哩哔哩_bilibili 目录 首先下transformer和LSTM的最大区别是什么&#xff1f; 1.positional \ encoding, 即位置嵌入(或位置编码); 2 自注…

windows连接CentOS数据库或Tomcat报错,IP通的,端口正常监听

错误信息 数据库错误&#xff1a; ERROR 2003 (HY000): Cant connect to MySQL server on x.x.x.x (10060) Tomcat访问错误&#xff1a; 响应时间过长 ERR_CONNECTION_TIMED_OUT 基础排查工作 【以下以3306端口为例&#xff0c;对于8080端口来说操作是一样的&#xff0c;只需…

NM2-WRDUW施耐德电动机保护器EOCR-NM2

EOCR智能电动机保护器原产地为韩国&#xff0c;隶属于施耐德(韩国)电气有限公司工厂。此公司早起源于韩国三和SAMWHA株式会社&#xff0c;是早研发电子式电动机保护器厂家&#xff0c;产品涵盖过电流继电器EOCR-SS,EOCR-SE2,EOCR-AR&#xff0c;欠电流继电器EUCR&#xff0c;数…

3分钟快速了解VR全景编辑器

说到VR全景&#xff0c;想必大多数人都见过那种可以360旋转拖动观看的图片。虽然这种技术已经不算新鲜&#xff0c;如果你以为这就是VR全景的全部&#xff0c;那就大错特错了&#xff01; 上面看到的这种形式&#xff0c;只能算VR全景的第一层形态。现在的VR全景已经发展成为了…

LabVIEW自动机械变速器(AMT)开发

LabVIEW自动机械变速器&#xff08;AMT&#xff09;开发 在现代汽车工业中&#xff0c;提升车辆的自动化水平和驾驶体验是一个不断追求的目标。随着技术的发展&#xff0c;自动机械变速器&#xff08;AutomatedMechanical Transmission, AMT&#xff09;凭借其较高的能效和较低…

四、VGA项目:联合精简帧+双fifo+sobel算法 实现VGA显示

前言&#xff1a;该项目实际上是在很多基础的小练习上合成起来的&#xff0c;例如涉及到uart&#xff08;rs232&#xff09;的数据传输、双fifo流水线操作、VGA图像显示&#xff0c;本次内容在此基础上又增添了sobel算法&#xff0c;能实现图像的边沿监测并VGA显示。 文章目录…

你写的每条SQL都是全表扫描吗

你写的每条SQL都是全表扫描吗&#xff1f;如果是&#xff0c;那MySQL可太感谢你了&#xff0c;每一次SQL执行都是在给MySQL上压力、上对抗。MySQL有苦难言&#xff1a;你不知道索引吗&#xff1f;你写的SQL索引都失效了不知道吗&#xff1f;慢查询不懂啊&#xff1f;建那么多索…

Xinstall助力App地推监测,实现精准效果评估

在移动互联网时代&#xff0c;App的推广已经成为企业营销的重要手段。然而&#xff0c;如何有效地监测App地推效果&#xff0c;一直是广告主和开发者面临的难题。幸运的是&#xff0c;Xinstall作为国内专业的App全渠道统计服务商&#xff0c;为广告主和开发者提供了一站式的解决…

【C++阅览室】C++之Vector(容器)

目录 vector的介绍 vector的使用 vector的定义 vector iterator 的使用 vector 空间增长问题 vector 增删查改 vector 迭代器失效问题。&#xff08;重点&#xff09; vector的介绍 1、 vector 是表示可变大小数组的序列容器&#xff0c;可以使用连…

java.lang.NoSuchMethodException: com.ruoyi.web.controller.test.bean.HeadTeacher

软件开发过程中使用Java反射机制时遇到了下面的问题 com.ruoyi.web.controller.test.bean.HeadTeacher4b9af9a9 com.ruoyi.web.controller.test.bean.HeadTeacher4b9af9a9java.lang.NoSuchMethodException: com.ruoyi.web.controller.test.bean.HeadTeacher.<init>(java…

英飞凌TC3xx 启动逻辑梳理(1)

目录 1.启动时序总览 2.Boot Firmware干了什么&#xff1f; 2.1 BMHD梳理 2.2 HWCFG 2.3 ABM 2.4 BMHD 无效时处理方案 2.5 HSM启动如何影响SSW启动 3.小结 在调TC3xx的板子时&#xff0c;最害怕的就是刷UCB&#xff1b;稍不注意板子就上锁&#xff0c;调试器也连不上了…

MacOS java多版本安装与管理

Home - SDKMAN! the Software Development Kit Manager # 安装sdkman curl -s "https://get.sdkman.io" | bashsource "$HOME/.sdkman/bin/sdkman-init.sh"sdk version正常出现sdkman版本号就安装成功了 # 安装java # 安装java8 sdk install java 8.0…

大数据------JavaWeb------Tomcat(完整知识点汇总)

Web服务器——Tomcat Web服务器定义 它是一个应用程序&#xff08;软件&#xff09;&#xff0c;对HTTP协议的操作进行封装&#xff0c;使得程序员不必直接对协议进行操作&#xff0c;让Web开发更便捷 Web服务器主要功能 封装HTTP协议操作&#xff0c;简化开发将Web项目部署到…

浅谈如何自我实现一个消息队列服务器(7)——编写服务器部分

文章目录 一、编写服务器代码1.1、分析一个服务器应具备的功能1.1.1、成员变量1.1.2、对外提供的接口 一、编写服务器代码 再次拿出这张图&#xff0c;前面我们已经将重要概念&#xff1a;VirtualHost、exchange、msgQueue、message、binding 都实现了&#xff0c;此时就可以开…

传统行业商家转到抖音开店怎么操作?电商的本质其实都一样

我是王路飞。 现在越来越多的传统行业商家开始转型到抖音上开店了。 不仅仅是因为现在的传统电商平台的环境、玩法、规则等&#xff0c;都对中小卖家非常苛刻&#xff0c;尤其是没有团队自己单干的&#xff0c;想做起来&#xff0c;真的挺难的。 更关键的是&#xff0c;抖音…

PCIE协议-1

1. PCIe结构拓扑 一个结构由点对点的链路组成&#xff0c;这些链路将一组组件互相连接 - 图1-2展示了一个结构拓扑示例。该图展示了一个称为层级结构的单一结构实例&#xff0c;由一个根复合体&#xff08;Root Complex, RC&#xff09;、多个端点&#xff08;I/O设备&#xf…

Dependencies:查找项目中dll关联文件是否缺失。

前言 Dependencies工具作为一款优秀的DLL解析工具&#xff0c;能让你很直观地看到DLL的相关信息&#xff0c;如具备哪些功能函数、参数&#xff0c;又比如该DLL基于哪些DLL运行。判断该dll基于哪些dll运行&#xff0c;如果基于的dll丢失&#xff0c;那么就会提示。就能判断缺少…
最新文章