目录
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 | |