目录
一、功能说明
- 能够读取mp3,wav,flac,ogg类型的文件并播放。
- 程序能够处理可能出现的异常,如文件不存在、文件读取错误等。
- 程序具有良好的用户界面,方便用户进行操作。
- 能够下载网络音乐。
二、窗体设计
如下图所示
三、代码实现
1、准备工作
axWindowsMediaPlayer无法播放ogg文件,添加NAudio库和NAudio.Vorbis库
2、定义变量
string[] files;//存储音频名称
List<string> localmusiclist = new List<string>();//用于存储多个文件
private WaveOutEvent outputDevice = null;//创建输出设备
private VorbisWaveReader vorbisReader = null;
3、音乐播放方法
private void Musicplay(string filename)
{
try
{
//获取文件扩展名
string extension = Path.GetExtension(filename);
//判断文件后缀名
if (extension == ".ogg")
{
OggDeal(filename);
}
else
{
axWindowsMediaPlayer1.URL = filename;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
catch (Exception ex)
{
MessageBox.Show($"无法播放音乐文件 {filename}: {ex.Message}", "播放错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
4、对ogg文件的处理
private void OggDeal(string oggFilePath)
{
try
{
//初始化vorbis格式读取器和输出设备
vorbisReader = new VorbisWaveReader(oggFilePath);
outputDevice = new WaveOutEvent();
outputDevice.Init(vorbisReader);
//开始播放音频
outputDevice.Play();
}
catch (Exception ex)
{
MessageBox.Show($"播放音频文件时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
5、添加音乐文件
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择音频|*.mp3;*.wav;*.flac;*.ogg";
openFileDialog1.Multiselect = true;//可使用鼠标选取多个文件
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
listBox1.Items.Clear();//清空listbox原有文件
if (files != null)
{
Array.Clear(files, 0, files.Length);//将files清空
}
files = openFileDialog1.FileNames;
string[] array = files;
foreach (string x in array)
{
listBox1.Items.Add(x);
localmusiclist.Add(x);
}
}
}
6、音频列表
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if(localmusiclist.Count > 0)
{
axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex];//设置URL以调用Musicplay
Musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]);//“music”处显示当前音乐名
}
}
7、音量调节
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;//将trackBar1的值传给axWindowsMediaPlayer1的音量
label2.Text = trackBar1.Value + "%";//显示当前音量
}
8、停止播放
private void button2_Click(object sender, EventArgs e)
{
if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
axWindowsMediaPlayer1.Ctlcontrols.pause();
}
//用NAudio库播放的OGG文件的情况
else if (outputDevice != null && outputDevice.PlaybackState == PlaybackState.Playing)
{
outputDevice.Pause();
}
}
9、下一首
private void button3_Click(object sender, EventArgs e)
{
int nextIndex = listBox1.SelectedIndex + 1;//将文件列表的索引加1,获取下一个音频文件。
if (nextIndex >= localmusiclist.Count)
{
nextIndex = 0;//播放到最后一个音频文件之后,下一首应该回到第一首。
}
axWindowsMediaPlayer1.URL = localmusiclist[nextIndex];
Musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[nextIndex]);
listBox1.SelectedIndex = nextIndex;//更改列表中选中文件
}
10、下载
private void button4_Click(object sender, EventArgs e)
{
string path = textBox1.Text;
string fileName = "newname.mp3";
string dir = @"D:\test\" + fileName;
//判断文件夹是否已存在
DirectoryInfo dinfo = new DirectoryInfo("D:\\Test");
if (dinfo.Exists)
{ }
else
{
Directory.CreateDirectory("D:\\Test ");//创建文件夹
}
using (WebClient client = new WebClient())
{
client.DownloadFile(path, dir);
}
}
四、功能展示
可通过鼠标多选添加音乐
点击列表内音乐进行播放
拖动trackbar控件调节音量
点击按钮停止播放
点击下一首按钮切换至下一首音乐
若为最后一首则切换至第一首音乐
在文本框输入网址并点击下载按钮,下载音乐
五、完整代码
using NAudio.Wave;
using NAudio.Vorbis;
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 NVorbis;
using System.Net;
namespace music
{
public partial class Form1 : Form
{
string[] files;//存储音频名称
List<string> localmusiclist = new List<string>();//用于存储多个文件
private WaveOutEvent outputDevice = null;//创建输出设备
private VorbisWaveReader vorbisReader = null;
public Form1()
{
InitializeComponent();
}
private void Musicplay(string filename)
{
try
{
//获取文件扩展名
string extension = Path.GetExtension(filename);
//判断文件后缀名
if (extension == ".ogg")
{
OggDeal(filename);
}
else
{
axWindowsMediaPlayer1.URL = filename;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
catch (Exception ex)
{
MessageBox.Show($"无法播放音乐文件 {filename}: {ex.Message}", "播放错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void openFileDialog1_FileOk_1(object sender, CancelEventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择音频|*.mp3;*.wav;*.flac;*.ogg";
openFileDialog1.Multiselect = true;//可使用鼠标选取多个文件
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
listBox1.Items.Clear();//清空listbox原有文件
if (files != null)
{
Array.Clear(files, 0, files.Length);//将files清空
}
files = openFileDialog1.FileNames;
string[] array = files;
foreach (string x in array)
{
listBox1.Items.Add(x);
localmusiclist.Add(x);
}
}
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if(localmusiclist.Count > 0)
{
axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex];//设置URL以调用Musicplay
Musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]);//“music”处显示当前音乐名
}
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;//将trackBar1的值传给axWindowsMediaPlayer1的音量
label2.Text = trackBar1.Value + "%";//显示当前音量
}
private void label2_Click(object sender, EventArgs e)
{
}
private void OggDeal(string oggFilePath)
{
try
{
//初始化vorbis格式读取器和输出设备
vorbisReader = new VorbisWaveReader(oggFilePath);
outputDevice = new WaveOutEvent();
outputDevice.Init(vorbisReader);
//开始播放音频
outputDevice.Play();
}
catch (Exception ex)
{
MessageBox.Show($"播放音频文件时出错: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void button2_Click(object sender, EventArgs e)
{
if (axWindowsMediaPlayer1.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
axWindowsMediaPlayer1.Ctlcontrols.pause();
}
//用NAudio库播放的OGG文件的情况
else if (outputDevice != null && outputDevice.PlaybackState == PlaybackState.Playing)
{
outputDevice.Pause();
}
}
private void button3_Click(object sender, EventArgs e)
{
int nextIndex = listBox1.SelectedIndex + 1;//将文件列表的索引加1,获取下一个音频文件。
if (nextIndex >= localmusiclist.Count)
{
nextIndex = 0;//播放到最后一个音频文件之后,下一首应该回到第一首。
}
axWindowsMediaPlayer1.URL = localmusiclist[nextIndex];
Musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[nextIndex]);
listBox1.SelectedIndex = nextIndex;//更改列表中选中文件
}
private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
{
}
private void button4_Click(object sender, EventArgs e)
{
string path = textBox1.Text;
string fileName = "newname.mp3";
string dir = @"D:\test\" + fileName;
//判断文件夹是否已存在
DirectoryInfo dinfo = new DirectoryInfo("D:\\Test");
if (dinfo.Exists)
{ }
else
{
Directory.CreateDirectory("D:\\Test ");//创建文件夹
}
using (WebClient client = new WebClient())
{
client.DownloadFile(path, dir);
}
}
}
}