您的位置:首页 > 其它

使用第三方类库n-audio播放MP3文件

2009-12-13 11:34 369 查看
DirectX由于期末考试,暂时先不研究了.这学期的期末考试估计得挂几科了,英语依然是个闹啊,其实我本来初中英语挺好的,哎~~现在完啦.越来越发现英语的重要性,但英语水平却越来越跟不上同龄人,矛盾啊.不过矛盾是激励社会发展的动力,希望也能够成为我学习英语的动力吧.

前两天看了看c#实现MP3功能的代码.网上不是很多,大体上分三种方法.调用windowsAPI,使用DirectX sound,和第三方类库.前两个比较简单.但第三方类库一来不好找,而来很复杂,而且都是外国人写的.我英语就很差,帮助文档对我来说就是抓瞎.研究了几天有一点小小的心得,希望能给英语一样和我不好的"同志"一点帮助~~

好进入正题我不说别的,只说N-Audio这套类库,是个外国人写的,代码安全,全面,而且是个开源的类库,你使用不用担心突然有一天法院一个传票过去说怀疑你对某某公司涉嫌侵权~~哈哈,这套类库在我发布的资源里有,解压后大约有20兆左右.

解压后共有三个文件夹,分别是Binaries,SampleApp,SourceCode分别是N-audio的类库Dll文件,实例应用,和源码,如果你想在你的项目中使用n-audio就要在引用中添加Binaries里的n-audio.dll文件了.至于怎么使用,我们直接看源码:

打开解决方案后,一共有8个项目,有音频文档查看,音频文档转换,n-audio的实例,其中n-audio的项目就是你引用的n-audio.dll文件的源码了;

作为播放Mp3文件们介绍几个核心类:

Mp3fileReader,继承自WaveStream它有两种构造形势,一是通过传入文件名来构造Mp3FileReader另一个就是传入流来构造它了,形势分别是:Mp3FileReader(string filename)和Mp3FileReader(stream _stream);让我们来看一下它的类关系图:



熟习设计模式的人也许很快就会发现,MP3FileReader就是那个可以生产具体产品的车间通过构造它你就可以构造出可以读取MP3问件的实例来~~

接着我们来说明MP3format类:

在说此类之前不得不先介绍一下关于MP3文件的一些知识,我们知道,硬盘式用来存储数字信号,也就是二进制信号的,而声音却是模拟信号,要想在硬盘中存储声音就必须将模拟信号数字化,那么如何将模拟信号进行数字化呢?我们知道,模拟信号时连续不离散的,而数字信号是不能储存非离散信息的,记得小时候学过怎么计算圆的面积吗?我们将圆分成很多小三角形,然后将三角形拼成正方形来计算面积,小三角形越多,所计算出的面积就越接近真实值.储存音频信号也是这个原理,它每隔一段时间(一般都是毫秒级)记录一次此时的波形幅值这样当你间隔的实间足够小就可以模拟出清晰的音频信号了.这里只要大概了解就可以,想知道详细的,网上有的是解释.我们接着说,但是用这中方法保存的文件时很大的,一份中大约要10兆的空间,于是便出现了MP3各式文件,它将音频文件分成若干块,将每块按照一定的算法压缩,这样可以将问件压缩至原来的十分之一.

MP3Format主要记录MP3文件的各式信息,继承自waveFormat类.用于支持MP3Filereader类读写MP3流和MP3文件.类关系图如下:



下面我们就说明一下如何具体的播放一个MP3文件:

IWavePlayer waveOut;

string fileName = null;

WaveStream mainOutputStream;

WaveChannel32 volumeStream;

private WaveStream CreateInputStream(string fileName)

{

WaveChannel32 inputStream;

WaveStream mp3Reader = new Mp3FileReader(fileName);

WaveStream pcmStream = WaveFormatConversionStream.CreatePcmStream(mp3Reader);

WaveStream blockAlignedStream = new BlockAlignReductionStream(pcmStream);

inputStream = new WaveChannel32(blockAlignedStream);

lumeStream = inputStream;

var meteringStream = new MeteringStream(inputStream, inputStream.WaveFormat.SampleRate / 10);

return meteringStream;

}

private void CreateWaveOut()

{

CloseWaveOut();

WaveOut outputDevice = new WaveOut(callbackInfo);

outputDevice.DesiredLatency = latency;

waveOut = outputDevice;

}

public void play()

{

try

{

CreateWaveOut();

}

catch (Exception driverCreateException)

{

MessageBox.Show(String.Format("{0}", driverCreateException.Message));

return;

}

mainOutputStream = CreateInputStream(fileName);

try

{

waveOut.Init(mainOutputStream);

}

catch (Exception initException)

{

MessageBox.Show(String.Format("{0}", initException.Message), "Error Initializing Output");

return;

}

waveOut.Play();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: