码迷,mamicode.com
首页 > Windows程序 > 详细

C# wave mp3 播放器探寻

时间:2015-01-18 07:04:13      阅读:526      评论:0      收藏:0      [点我收藏+]

标签:

最近无聊,想听听歌曲。可怜新电脑上歌曲就两三首,要听其它的就得在旧电脑上播放。可是,那台古董但不失健壮的本本被老婆无情的霸占了。无奈。

思来想去,得,写个程序播放吧。做个C/S播放器。

理想是美好的,现实是残酷的。 在繁琐的查找和测试之后,找来了NAdio(26 Oct 2012 NAudio 1.6)这个开源的第三方插件。

先写个结论再写过程。

结论

 

使用.net自带的SoundPlayer来播放wave文件需要注意几个地方:

  • 使用FileStream 或 MemoryStream 时 ,流的Position一定要为 0,流不能被关闭。即需要注意流对象的生命周期
  • 无法使用Wave文件的一段来播放。
  •  Stream属性可指定要播放的流

 

二、使用NAiduo库播放文件需要注意几个地方

  • 对文件类型进行判断时,先判断Wave文件,若非wave文件,则使用 Mp3Freame 来判断是否为mp3文件
  • 若使用NAudio库提供的 WaveOut 播放,需要注意,它在文件播放完时并不会把 PlaybackState 置为 PlaybackState.Stopped,这个需要手动判断了。
  • 若要 get / set 播放的进度时间音量,则需要使用 WaveChannel32 
  • NAudio库的 Volume 的音量调用有问题,使用默认值即可。

 

过程

 

NAudio提供的示例

  •  NAudio的源文件中提供了一些示例
  • http://naudio.codeplex.com/的网页中,Projects Using NAudio 同样有一些 
  • 当然,更好的是 DOCUMENTION 下面的 How do I...? 这里直接有播放Wave和Mp3的救命代码
  • 还有一篇  A Simple C# Player Mp3 with NAudio 的文章 

 

开始

     大家都清楚播放器的基本构成包含: 音量控制进度控制时间显示播放暂停停止 等几个基本动做,以及 播放结束时引发的事件。所以,              技术分享  

上图AudioPlayer为播放器的对象,但实际的播放操作是由NAudio来完成。所以,

              技术分享

使用AudioCore来完成NAudio实际的播放动作。那么,如何操作音量、进度及显示时间呢?这些就是要 AudioVolume AudioTimePosition 来完成了。

 

              技术分享        技术分享

 

OK,所有的对象都已经建立,只需要有机的结合在一起就可以工作了。下面来做个实际测试。

让我们来听下单田芳讲的《西游记》

         技术分享

三、结束

     结束的貌似快了点。hi~hi~,咱这是效率。附代码。有兴趣的同学可以用Reflector反编译 goldli.Utility.AudioPlayer.dll 。有问题发邮件。闪了

 

====================================================

用C#和NAudio解码库播放mp3示例

 

本文并非使用wmp控件和mci,而是用NAudio库原生解码,占用资源很小。推荐C#和.Net开发人员使用。

 

NAudio 是一款开源的用于.NET平台下的音频处理类库。提供了很多的简易方法来操作音频数据。

下图是官方示例程序。

源代码和示例程序地址见官网: http://naudio.codeplex.com/

技术分享

 

 

经过对示例程序分析,可得出播放mp3的最小代码如下:

 

using System;
 using System.Text;
 using NAudio.Wave;
 using NAudio.CoreAudioApi;
 using System.Threading;
 using System.IO;

 namespace KidPlayer
{

    class Program
    {
        static void Main()
        {
            using (var ms = File.OpenRead(@"test.mp3"))
            using (var rdr = new Mp3FileReader(ms))
            using (var wavStream = WaveFormatConversionStream.CreatePcmStream(rdr))
            using (var baStream = new BlockAlignReductionStream(wavStream))
            using (var waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
            {
                waveOut.Init(baStream);
                waveOut.Play();
                while (waveOut.PlaybackState == PlaybackState.Playing)
                {
                    Thread.Sleep(100);
                }
            }
        }
    }
        
    
}

 

 ==============================================

转:用C#和NAudio解码库播放mp3示例

http://naudio.codeplex.com/

 

  1. using NAudio;  
  2. using NAudio.Wave;  
  3. using NAudio.CoreAudioApi;  
  4.   
  5. WaveOut waveOut = null;  
  6.   
  7. var rdr = new Mp3FileReader("1.mp3");  
  8. var wavStream = WaveFormatConversionStream.CreatePcmStream(rdr);  
  9. var baStream = new BlockAlignReductionStream(wavStream);  
  10. waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback());  
  11. waveOut.Init(baStream);  
  12. waveOut.Play();  
using NAudio;
using NAudio.Wave;
using NAudio.CoreAudioApi;

WaveOut waveOut = null;

var rdr = new Mp3FileReader("1.mp3");
var wavStream = WaveFormatConversionStream.CreatePcmStream(rdr);
var baStream = new BlockAlignReductionStream(wavStream);
waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback());
waveOut.Init(baStream);
waveOut.Play();

目前测试支持320kbps码率的mp3文件

 ============================================

             在unity中使用naudio             2012-01-08 22:09:10          

分类: 嵌入式

 

当我使用unity3D引擎时我很希望能加入录音功能,但是官方版的naudio的dll库会在载入unity3D时失败。

经过我的实践,我发现问题是这样的,官方的naudio库使用csc.exe和.net framework 4.0来编译,但是unity3D仅仅支持mono和.net framework 2.0,当修改过一些语法差异之后,我编译成功,并且在录音和播放测试中成功了。

我建立了一个google code的项目:

http://code.google.com/p/naudio-with-unity3d/

以方便其他人使用dll,而不用花费巨大的精力来修改语法差别。

 

C# wave mp3 播放器探寻

标签:

原文地址:http://www.cnblogs.com/qq260250932/p/4231410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!