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

news2024/11/20 7:17:59

目录

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)选择音乐进行播放

ListBox控件中,利用SelectedIndexChanged 选择歌曲的编码SelectedIndex ,并通过SelectedIndex与localmusiclist 进行选择歌曲的播放。

        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)异常信息进行处理

使用try  catch 语句对播放的文件进行异常处理,包括文件不存在异常、文件读取错误异常以及其他的异常。

        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)停止播放和下一曲功能

        ogg文件使用waveOutEvent.Stop()停止播放;

        MP3文件使用axWindowsMediaPlayer1.Ctlcontrols.stop()停止播放。

        private void button2_Click(object sender, EventArgs e)
        {
            if (waveOutEvent.PlaybackState == PlaybackState.Playing)
            {
                //停止ogg文件播放
                waveOutEvent.Stop();
            }
            else
                //停止其他类型文件播放
                axWindowsMediaPlayer1.Ctlcontrols.stop();
        }

       播放下一首歌曲需要将ListBox 中正在播放的歌曲的编码更新为下一首歌的编码,若正在播放的为歌单的最后一首歌,需要将正在播放的歌曲的编码更新为第一首歌的编码,同时更新Label中的内容。

        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第三方库实现播放音乐,同时注意要提前下载需要用到的库;

如何对音量进行控制

        将 WindowsMediaPlayer的属性和TrackBar设置的值进行关联,达到音量控制的效果。

        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、代码仓库

详情补充请见评论区哈

仓库地址
GitHub

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

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

相关文章

Apinto下载安装以及集群部署总结

下载 下载官方提供的安装包安装&#xff08;推荐&#xff09; wget https://github.com/eolinker/apinto/releases/download/v0.13.3/apinto_v0.13.3_linux_amd64.tar.gz && tar -zxvf apinto_v0.13.3_linux_amd64.tar.gz && cd apinto 安装 先确保已经入解…

Debian mariadb 10.11 XXXX message from server: “Too many connections“

问题表现 报错信息&#xff1a;Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections" 处理步骤 1、尝试能不能通过终端登录&…

[报错解决]Communications link failure

报错 主机IDEA项目连接虚拟机的数据库报错。 主要报错信息有&#xff1a; com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received a…

MySQL数据库——基础事务操作-BEGIN-COMMIT-ROLLBACK

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…

算法系列--BFS解决拓扑排序

&#x1f495;"请努力活下去"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–算法系列–BFS解决拓扑排序 大家好,今天为大家带来的是算法系列--BFS解决拓扑排序 前言:什么是拓扑排序 拓扑排序–解决有顺序的排序问题(要做事情的先后顺序) …

3D技术成为电商流量密码,如何提高商品转化率?

随着互联网技术的飞速发展和Web3.0时代的到来&#xff0c;消费者的购物体验需求也在经历着前所未有的变革。从传统的线下购物到线上网站&#xff0c;再到直播带货等多元化消费形式的涌现&#xff0c;消费者对产品展示形式的视觉冲击力要求日益提升。 在这一背景下&#xff0c;3…

django中的日志处理

1、事件追踪 在什么样的时间发生了什么样的事情 2、bug调试 3、程序告警 4、大数据统计 ELK 日志分析系统 elasticsearh logstasn kibana 名词概念 loggers&#xff1a;日志器 —— 定大方向&#xff1a;1 handlers&#xff1a;处理器 —— 执行:3 formatters&#xff…

车载电子电器架构 —— 应用软件开发(上)

车载电子电器架构 —— 应用软件开发(上) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

c++:(map和set的底层简单版本,红黑树和AVL树的基础) 二叉搜索树(BST)底层和模拟实现

文章目录 二叉搜索树的概念二叉搜索树的操作二叉搜索树的查找find 二叉搜索树的模拟实现构造节点insertfinderase(细节巨多,面试可能会考)a.叶子节点b.有一个孩子左孩子右孩子 c.有两个孩子注意: erase代码 中序遍历 二叉搜索树的应用k模型k模型模拟实现的总代码 k-value模型k-…

fb设备驱动框架分析

一、字符设备注册过程&#xff1a; 归根到底&#xff0c;fb设备也是一个字符设备&#xff0c;所以逃不开常规的字符设备驱动框架&#xff1a; Linux内核中编写字符设备驱动通常遵循以下步骤&#xff1a; ①、定义主设备号&#xff1a; 在Linux中&#xff0c;每个字符设备都…

第十五届蓝桥杯python B组省赛

前言&#xff1a; 这是我第一次参加蓝桥杯&#xff0c;成绩并不理想&#xff0c;我反思了一下午&#xff0c;我的问题主要是知识点学不透&#xff0c;题目做的太少&#xff0c;而且学习的时候少数时间不专心&#xff0c;但是&#xff0c;我能感觉到我的学习能力并不弱&#xf…

Unity TileMap入门

概述 相信很多同学学习制作游戏都是从2D游戏开始制作的吧&#xff0c;瓦片地图相信大家都有接触&#xff0c;那接下来让我们学习一下这部分的内容吧&#xff01; Tilemap AnimationFrameRate:设置每帧动画的播放速率。Color:瓦片地图的颜色TileAnchor:锚点&#xff0c;&#x…

AI英语口语训练软件有哪些?这4款简单易用

AI英语口语训练软件有哪些&#xff1f;AI英语口语训练软件在现代语言学习中确实扮演着举足轻重的角色。它们凭借先进的智能算法&#xff0c;能够为我们量身定制学习方案&#xff0c;精准识别并纠正发音错误&#xff0c;模拟真实对话场景&#xff0c;使学习过程更加高效、有趣。…

Qt复习第二天

1、菜单栏工具栏状态栏 #include "mainwindow.h" #include "ui_mainwindow.h" #pragma execution_character_set("utf-8"); MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//菜…

【C++】转换构造函数和类型转换函数

目录 转换构造函数转换构造函数调用 类型转换函数类型转换函数定义形式应用 转换构造函数 转换构造函数就是一种构造函数&#xff0c;将一个其他类型的数据转换成一个类的对象的构造函数。 类型->类对象 转换构造函数调用 &#xff08;1&#xff09;显式强制类型转换&…

抽象类基本概念

抽象类及抽象方法 概念&#xff1a;一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这种类被定义为抽象类&#xff0c;含有抽象方法的类也被称为抽象类。 用通俗的话来说就是当一个类的某个功能&#xff08;方法&#xff09;实现不确定时&#xff0c;我们就将该…

数据挖掘(二)数据预处理

前言 基于国防科技大学 丁兆云老师的《数据挖掘》 数据挖掘 数据挖掘&#xff08;一&#xff09;数据类型与统计 2、数据预处理 2.1数据清理 缺失值处理&#xff1a; from sklearn.impute import SimpleImputer# 创建一个SimpleImputer对象&#xff0c;指定缺失值的处理策略…

信息系统项目管理基础

目录 一、项目管理概论 1、定义 2、项目管理的十二原则 3、SMART原则 4、项目经理 5、项目的生命周期 二、项目立项管理 1、项目启动过程 三、项目整合管理 1、管理基础 2、项目整合管理过程 ①制定项目章程 ②制定项目管理计划 ③指导与管理项目工作 ④管理项目…

【算法与数据结构】数组

文章目录 前言数组数组的定义数组的基本操作增加元素删除元素修改元素查找元素 C STL 中的数组arrayvector Python3 中的列表访问更改元素值遍历列表检查列表中是否存在某元素增加元素删除元素拷贝列表总结 Python3 列表的常用操作 参考资料写在最后 前言 本系列专注更新基本数…

计算机系列之数据库技术

13、数据库技术&#xff08;重点、考点&#xff09; 1、三级模式-两级映像&#xff08;考点&#xff09; 内模式&#xff1a;管理如何存储物理的数据&#xff0c;对应具体物理存储文件。 **模式&#xff1a;**又称为概念模式&#xff0c;就是我们通常使用的基本表&#xff0c…