目录
1 简介
在这篇博客中,我将讨论基于C#编码实现音乐文件的播放功能,给出实验的具体方法和代码实现。
2 实验内容
请编写一个C#程序,实现音乐文件的播放功能。
2.1 要求1
1. 程序应能够读取MP3文件,并播放其中的音频。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用WindowsMediaPlayer控件
2.2 要求2
1. 程序应能够播放ogg文件。
2. 程序应能够处理可能出现的异常,如文件不存在、文件读取错误等。
3. 程序应具有良好的用户界面,方便用户进行操作。
4. 程序应具有良好的兼容性,能在不同版本的C#中正常运行。
提示:此功能可以使用Nuget程序包中的Naudi.Vorbis控件
3 实现代码
clone address:kaka053/mediaplayer (github.com)
//使用了NAudio库来处理音频文件的播放和解码
using NAudio.Vorbis;
using NAudio.Wave;
//导入了NAudio库中的两个命名空间,分别用于处理Ogg Vorbis格式的音频文件和WAV格式的音频文件
namespace mediaplayer
{
public partial class Form1 : Form
{
string[] files;
List<string> localmusiclist = new List<string> { };
//声明了一个字符串数组files和一个字符串列表localmusiclist,用于存储选择的音频文件路径
public Form1()
{
InitializeComponent();
}
private void musicplay(string filename)
{
string extension = Path.GetExtension(filename);
if (extension == ".ogg") { Console.WriteLine("this is ogg file"); }
else
{
Console.WriteLine("this is not ogg");
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
//这个方法接受一个文件名作为参数,根据文件扩展名判断是否为Ogg Vorbis格式的文件。如果是,则输出"this is ogg file";否则,输出"this is not ogg"并调用axWindowsMediaPlayer1控件的play方法进行播放
private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "选择音频|*mp3;*.wav;*.flac";
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
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);
}
}
}
//这个方法是按钮点击事件处理方法,用于打开文件对话框选择音频文件,并将选择的文件路径添加到localmusiclist列表中
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (localmusiclist.Count > 0)
{
axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex];
musicplay(axWindowsMediaPlayer1.URL);
label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]);
}
}
//这个方法是列表框选择项改变事件处理方法,用于设置axWindowsMediaPlayer1控件的URL属性,并调用musicplay方法进行播放
private void trackBar1_Scroll(object sender, EventArgs e)
{
axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
label2.Text = trackBar1.Value + "%";
}
//这个方法是滑块滚动事件处理方法,用于设置axWindowsMediaPlayer1控件的音量
private void button2_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
}
//这个方法是按钮点击事件处理方法,用于停止axWindowsMediaPlayer1控件的播放
private void button3_Click(object sender, EventArgs e)
{
if (localmusiclist.Count > 0)
{
int nextIndex = listBox1.SelectedIndex + 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 button4_Click(object sender, EventArgs e)
{
string oggFilePath = " ";
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "播放音频|*.ogg";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
oggFilePath = openFileDialog.FileName;
}
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);
}
}
}
}
//这个方法是按钮点击事件处理方法,用于打开文件对话框选择Ogg Vorbis格式的音频文件,并使用NAudio库的VorbisWaveReader和WaveOutEvent类进行播放
}
}
4 实验难点
4.1 C#如何播放mp3/wav文件
NAudio:NAudio是一个开源的音频和MIDI处理库,它支持多种音频格式,包括MP3(通过LAME MP3编码器解码器)和WAV。
URL(Uniform Resource Locator,统一资源定位符)是互联网上标准资源的地址。它是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,包含了信息指出文件的位置以及浏览器应该怎么处理它。每一个互联网上的文件都有一个唯一的URL。
URL的作用主要是识别互联网中的信息资源,并将互联网提供的服务统一编址。通过URL,我们可以到达任何一个地方寻找需要的东西,如文件、数据库、图像、新闻等。URL一般由几个部分组成,包括协议(例如HTTP)、主机名(或IP地址)、端口(可选)、路径、参数(可选)、查询(可选)以及信息片断(可选)。
4.2 C#如何播放ogg文件
在C#中播放OGG文件并不直接支持,因为OGG格式不是Windows Media Player或.NET Framework默认支持的音频格式。但是,你可以使用一些第三方库来实现这个功能。一个常用的库是NAudio,它提供了在.NET环境中处理音频的强大功能。
4.2.1 异常
System.Runtime.InteropServices.COMException:“不支持给定的 URL 的字节流类型
如果你在尝试使用 NAudio.Wave.AudioFileReader
来读取一个OGG文件,并且遇到了 System.Runtime.InteropServices.COMException
异常,提示“不支持给定的 URL 的字节流类型”,这通常意味着 AudioFileReader
并不直接支持OGG格式。AudioFileReader
主要用于读取PCM格式的音频文件,或者那些可以由NAudio内置的解码器直接解码的格式。
OGG通常使用Vorbis编码,而NAudio本身并不直接包含Vorbis解码器。为了播放OGG文件,你需要使用一个支持OGG/Vorbis解码的库。一个常用的选择是 NAudio.Vorbis
,这是一个NAudio的扩展库,提供了对OGG/Vorbis的支持。
4.2.2Vorbis解码器如何解析ogg文件
Vorbis解码器用于解析OGG文件,主要是将OGG容器中的Vorbis编码的音频数据解码为PCM(脉冲编码调制)数据,这样音频数据就可以被音频播放设备或软件所处理。NAudio库中的NAudio.Vorbis
扩展提供了对Vorbis解码的支持,通过OggVorbisFileReader
类可以方便地读取和解码OGG文件。
下面是一个使用OggVorbisFileReader
来解析OGG文件的基本步骤:
安装NAudio和NAudio.Vorbis:
通过NuGet安装NAudio和NAudio.Vorbis库。创建OggVorbisFileReader实例:
使用OGG文件的路径来创建OggVorbisFileReader
的实例。这个类会负责读取和解码OGG文件。读取音频数据:
通过OggVorbisFileReader
的Read
方法,你可以从OGG文件中读取解码后的PCM数据。这些数据可以被直接发送到音频输出设备播放,或者进行进一步的处理。处理音频数据:
你可以选择将PCM数据写入到一个WaveStream
中,然后使用WaveOut
类来播放它。或者,你也可以对PCM数据进行其他类型的处理,比如分析音频特性、转换格式等。释放资源:
使用完OggVorbisFileReader
后,确保调用其Dispose
方法或使用using
语句来自动释放资源。