Windows程序设计课程作业-2(音乐文件播放功能)

目录

1、作业内容

要求1:

提示:

要求2:

提示:

作业提交方式:

2、主要思路

1)准备工作

2)提取音乐文件功能

3)选择音乐进行播放

4)异常信息进行处理

5)停止播放和下一曲功能

3、难点分析

如何播放ogg格式文件

如何对音量进行控制

4、实现代码

5、运行结果


1、作业内容

要求1:

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

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

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

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

提示:

此功能可以使用WindowsMediaPlayer控件

要求2:

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

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

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

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

提示:

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

作业提交方式:

以博客提交,博客中需要对功能设计与实现进行说明,附上代码的clone地址;

2、主要思路

1)准备工作

需要安装功能需要的Nuget程序包中的Naudi.Vorbis控件

了解Naudio:

C#播放音频的正确姿势(一)——NAudio的简介与基础播放-CSDN博客

设置所需控件:

Label :显示正在播放的歌曲。

ListBox :显示选择的所有歌曲。

WindowsMediaPlayer :播放常规格式音乐(ogg无法播放)。

TrackBar :用于音量控制。

Button :用于控制音乐播放,包括选择歌曲、停止播放、下一曲。

OpenFileDialog :用于获取音乐文件。

2)提取音乐文件功能

各个变量的意义: 

files 用于存放选择的音乐文件。

localmusiclist在音乐播放应用中用来追踪和管理用户加载的音乐文件集合。

waveOutEvent用于播放ogg文件。

vorbisReader用于记录ogg文件的状态。

        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav";
            openFileDialog1.Multiselect = true;//可以同时打开多个文件
            if(openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                localmusiclist.Clear();
                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);
                }
            }
        }

3)选择音乐进行播放

        private void label1_Click(object sender, EventArgs e)
        {
            if (localmusiclist.Count > 0)
            {
                //选择歌单中要播放的歌曲进行播放
                axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex];
                musicplay(axWindowsMediaPlayer1.URL);
                //更新正在播放的歌曲
                label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]);
            }
        }

4)异常信息进行处理

        private void musicplay(string filename)
        {
            string extension = Path.GetExtension(filename);
            try
            {
                if (extension == ".ogg")
                {
                    if (vorbisReader != null)
                    {
                        //确保先停止当前播放再释放资源
                        if (waveOutEvent.PlaybackState != PlaybackState.Stopped)
                        {
                            waveOutEvent.Stop();
                        }
                        vorbisReader.Dispose();
                    }
                    //播放ogg文件
                    vorbisReader = new VorbisWaveReader(filename);
                    waveOutEvent.Init(vorbisReader);
                    waveOutEvent.Play();
                }
                else
                {
                    axWindowsMediaPlayer1.URL = filename;
                    axWindowsMediaPlayer1.Ctlcontrols.play();
                }
            }
            catch(FileNotFoundException ex)
            {
                Console.WriteLine(ex.Message);
            }
            catch (IOException ex)
            {
                Console.WriteLine("读取文件时发生错误: " + ex.Message);
            }
            //其他异常
            catch (Exception ex)
            {
                Console.WriteLine("发生未知错误: " + ex.Message);
            }
        }

5)停止播放和下一曲功能

        private void button2_Click(object sender, EventArgs e)
        {
            if (waveOutEvent.PlaybackState == PlaybackState.Playing)
            {
                //停止ogg文件播放
                waveOutEvent.Stop();
            }
            else
                //停止其他类型文件播放
                axWindowsMediaPlayer1.Ctlcontrols.stop();
        }
        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(axWindowsMediaPlayer1.URL);
                listBox1.SelectedIndex = index;
            }
        }

3、难点分析

如何播放ogg格式文件

如果是ogg文件,调用NAudio第三方库实现播放音乐,同时注意要提前下载需要用到的库;

如何对音量进行控制

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

4、实现代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using NAudio;
using NAudio.Wave;
using NAudio.Vorbis;
using NVorbis;

namespace WindowsFormsmusic1
{
    public partial class Form1 : Form
    {
        string[] files;

        List<string> localmusiclist=new List<string>
        {

        };
        private WaveOutEvent waveOutEvent = new WaveOutEvent();
        private VorbisWaveReader vorbisReader;
        public Form1()
        {
            InitializeComponent();
        }


        private void musicplay(string filename)
        {
            string extension = Path.GetExtension(filename);
            try
            {
                if (extension == ".ogg")
                {
                    if (vorbisReader != null)
                    {
                        //确保先停止当前播放再释放资源
                        if (waveOutEvent.PlaybackState != PlaybackState.Stopped)
                        {
                            waveOutEvent.Stop();
                        }
                        vorbisReader.Dispose();
                    }
                    //播放ogg文件
                    vorbisReader = new VorbisWaveReader(filename);
                    waveOutEvent.Init(vorbisReader);
                    waveOutEvent.Play();
                }
                else
                {
                    axWindowsMediaPlayer1.URL = filename;
                    axWindowsMediaPlayer1.Ctlcontrols.play();
                }
            }
            catch(FileNotFoundException ex)
            {
                Console.WriteLine(ex.Message);
            }
            catch (IOException ex)
            {
                Console.WriteLine("读取文件时发生错误: " + ex.Message);
            }
            //其他异常
            catch (Exception ex)
            {
                Console.WriteLine("发生未知错误: " + ex.Message);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "选择音频|*.mp3;*.flac;*.wav";
            openFileDialog1.Multiselect = true;//可以同时打开多个文件
            if(openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                localmusiclist.Clear();
                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 axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
        {

        }
        

        private void label1_Click(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)
        {
            if (waveOutEvent.PlaybackState == PlaybackState.Playing)
            {
                //停止ogg文件播放
                waveOutEvent.Stop();
            }
            else
                //停止其他类型文件播放
                axWindowsMediaPlayer1.Ctlcontrols.stop();
        }

        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(axWindowsMediaPlayer1.URL);
                listBox1.SelectedIndex = index;
            }
        }
        private void button4_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "OGG文件 (*.ogg)|*.ogg";
            openFileDialog1.Multiselect = false;

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string selectedFile = openFileDialog1.FileName;
                musicplay(selectedFile);
            }
        }
    }
}

5、运行结果

6、代码仓库

待会见评论区哈

仓库地址

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

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

相关文章

【最新点云数据增强综述】深度学习点云数据增强技术的进展

深度学习(DL)已成为点云分析任务(如检测、分割和分类)的主流和有效方法之一。为了减少深度学习模型训练过程中的过拟合,提高模型性能,尤其是在训练数据的数量和/或多样性有限的情况下,增强往往至关重要。虽然各种点云数据增强方法已被广泛应用于不同的点云处理任务中,但…

[muduo网络库]——muduo库的Reactor模型(剖析muduo网络库核心部分、设计思想)

一、前言 在学习 C 服务端的过程中&#xff0c;必不可少的一项就是熟悉一个网络库&#xff0c;包括网络库的应用和其底层实现。我们熟知的网络库有 libevent、libev、muduo、Netty 等&#xff0c;其中 muduo 是由陈硕大佬个人开发的 TCP 网络库&#xff0c;最近跟着课程正在深…

Springboot+Vue项目-基于Java+MySQL的车辆管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Java方法和数组

方法 Java中的方法就是c语言中的函数。 方法的定义 定义格式如下 修饰符 返回值 方法名([参数列表]){代码块[return 返回值;] } //方括号[]括起来代表可以没有&#xff0c;不是必须有的方法名采用小驼峰命名&#xff08;就是有多个单词&#xff0c;第一个单词首字母小写其…

Redis学习1——redis简介、基础

介绍 redis简介 Redis(Remote Dictonary Server) 是由Salvatore Sanfilippo开发的key-value缓存数据库&#xff0c;基于C语言开发。目前市面上&#xff0c;Redis和MongoDB是当前使用最广泛的NoSQL&#xff0c;而就Redis技术而言&#xff0c;它的性能十分优越&#xff0c;可以…

回溯法、全排列、子集等

回溯法 感想&#xff1a;回溯算法本质是一个循环&#xff0c;有点像while循环 一些回溯法&#xff08;递归&#xff09;的经典应用 1.全排列 2.子集 其实上面两个点&#xff0c;也是对应着高中数学里面的“排列”与“组合” 1.全排列问题 给定一个集合S{a,b,c}&#xff0…

mysql数据库标识符的使用

ddl CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL,userName varchar(20) DEFAULT NULL,pwd varchar(36) DEFAULT NULL,phone varchar(11) DEFAULT NULL,age tinyint(3) unsigned DEFAULT NULL,sex char(2) DEFAU…

crmeb的分销推广如何用

CRMBE分销推广说明 1、CRMEB分销模式 分销模式&#xff1a; 指定分销、人人分销、满额分销 指定分销&#xff1a; 用户默认无分销权限&#xff0c;需要后台开通分销权限后&#xff0c;才可以通过推广下级获得返佣&#xff1b; 人人分销&#xff1a; 用户在商城注册后自动获得分…

SpringBoot的图片上传

简介 该文档旨在介绍一个基于Spring Boot框架的简单文件上传功能的实现方式。本文档将详细介绍相关代码的功能和配置以及如何使用它们。 样例 技术栈 Spring Boot&#xff1a;一个用于快速开发基于Spring的应用程序的框架。Thymeleaf&#xff1a;一个用于在Web应用程序中创建…

超越机械抓手:看多指机器人如何灵活运用触觉?

论文标题&#xff1a; Learning Visuotactile Skills with Two Multifingered Hands 论文作者&#xff1a; Toru Lin, Yu Zhang, Qiyang Li, Haozhi Qi, Brent Yi, Sergey Levine, and Jitendra Malik 1. 机器人新挑战&#xff1a;多指手指操作 在自动化和智能化日益普及的…

winform图书管理系统

winform图书管理系统说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 图书管理员 读者管理 图书管理 添加 修改 删除 查看 入库 书册列表 书册管理用户管理退出 借书 还书 系统管理员 修改图书管理权限 项目获取&#xff1a;…

java对象互换工具类

1:将Object类型转成json字符串 /*** 将对象转为字符串* param obj* return*/public static String toString(Object obj) {if(obj null) {return null;}if ("".equals(obj.toString())) {return null;}if (obj instanceof String) {return obj.toString();}try {Ob…

20232906 2023-2024-2 《网络与系统攻防技术》第九次作业

20232906 2023-2024-2 《网络与系统攻防技术》第九次作业 1.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是&#xff1a;main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序同时包含另一个代码片段&#xff0c;getShell&am…

vscode远程免密ssh原理与实操方法

什么是SSH SSH是一种加密协议&#xff0c;全称为Secure Shell&#xff0c;用于安全地远程登录到服务器或其他远程设备上执行命令或传输文件。它提供了一种安全的加密通信机制&#xff0c;使得远程登录和文件传输等操作不会被恶意攻击者窃取或篡改&#xff0c;确保了数据的保密…

全球10KM土地利用程度数据

全球10KM土地利用程度数据 数据介绍 “一带一路”监测区域土地利用程度指数平均值为0.34&#xff0c;不同区域利用程度差异明显&#xff0c;但总体上高值区域与人口分布的稠密区域吻合。中南半岛、南亚、欧洲和小亚细亚半岛等地海拔较低&#xff0c;水热组合条件较好&#xff…

SqlServer数据库导出表结构和数据为脚本文档

需求&#xff1a;把数据库里的数据结构及数据存为脚本&#xff0c;下次一键执行数据库 操作方法&#xff1a; 一、右击该数据库&#xff0c;选择任务 二、下一步 三、如果导出整个数据库就默认&#xff0c;若导出指定的表和视图就选择具体的数据库对象 四、选择另存为脚本文件…

分解质因数-第12届蓝桥杯国赛Python真题解析

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第61讲。 分解质因数&#…

亚信安慧AntDB:解锁数智化的新时代

亚信安慧AntDB的融合实时的特性使得它在数据库领域独树一帜。传统的数据库系统往往只能追求数据的准确性和一致性&#xff0c;但在实际的业务场景中&#xff0c;这些特性并不能满足企业的需求。AntDB的出现打破了传统束缚&#xff0c;为企业带来了全新的数据处理方式&#xff0…

测试用例设计方法-状态迁移图法

一、介绍&#xff1a; 在软件测试领域中&#xff0c;状态迁移图法是一种极为重要且有效的测试方法。状态迁移图法侧重于分析和测试系统中存在的各种状态以及它们之间的迁移关系。所谓状态&#xff0c;就是系统在特定条件下所处的情况或模式&#xff0c;而迁移则是状态之间的转换…

抖音又出王炸级APP,免费的AI写真神器,一键生成不同场景的写真大片(附保姆级教程)

以前想要拍出一组写真大片&#xff0c;是不是还得跑摄像馆&#xff0c;化妆、换装、各种摆 pose、场景布置&#xff0c;少说也要折腾一上午&#xff0c;而且花费还不少。 而现在&#xff0c;有了 AI&#xff0c;在家里&#xff0c;一个人&#xff0c;一部手机&#xff0c;就能…