2011-07-18 79 views
7

我是一位多年经验丰富的MFC程序员,近些年来,他一直在Mac和iOS的Objective C中开发商业应用程序 - 我试图加快速度.Net和C#(因为我很快将被要求将我的商业应用程序之一从Mac转换到PC)。在.Net/C中播放音频#

我现在已经通过一些书籍和练习来熟悉.Net(和C#),我已经决定要将我的一个商业应用程序转换为.Net作为一种学习练习,一切都很顺利(界面工作,数据结构都很好),但我需要能够播放音频。

我的Mac应用程序从一系列数学公式生成音频 - 想象一个波形发生器 - 不完全相同,但相似。在Mac上,我生成16位带符号原始音频的音频,使用Core Audio设置音频输出路由,然后每当音频路由需要新的音频缓冲区时获得回调(这样我就可以即时生成音频) 。

我需要在PC上做同样的事情。不幸的是,我发现MSDN文档是“无法看到树木”的案例,因为有如此大量的文档。我可以找到允许我加载和播放mp3/wav等文件的类,但我需要实时生成音频。任何人都可以在正确的方向上指向我,找到能让我在缓冲区中填充缓冲区的东西吗?

THX

+0

我不太了解这个话题,但我发现这篇文章是*威力*帮助:http://channel9.msdn.com/coding4fun/articles/Generating-Sound-Waves-与C波振荡器 –

+0

看看这个:[使用C#播放音频从一个流](http://stackoverflow.com/questions/184683/play-audio-from-a-stream-using-c) – Rodney

回答

3

我在几个项目中使用了this sample,效果很好。它基本上是一个.net包装Windows Waveform Audio API使用P/Invoke。 其他选择:

+0

所有非常有用,NAudio网站上的正弦波演示似乎正是我想要的,我应该能够修改该代码并获得我需要的结果,非常感谢! –

+0

经过一个小时左右的时间,NAudio就开始运行并且运行得非常完美 - 我的应用程序现在非常具有声音效果!非常感谢您的建议! :O) –

+0

我很高兴你喜欢它。 – yms

2

我用Audiere做到这一点,并发现它工作得很好。

这确实是一个C++库,但是有一个可用于C#的set of bindings

欲了解更多信息,请参阅the question I asked

+0

谢谢,请看看! –

2

你应该看看FMOD它允许这种操作等等。它也是跨平台,如果你也在Mac上工作,可能会感兴趣。

+0

听起来有趣,我会看看,谢谢。 –

3

我已经创建了一个类,可以播放音频给定Stream派生作为输入。所以如果你能够将你的声音发生器打包到Stream兼容接口中,它可能适合你。

我是如何做到的 - 我使用了旧版Windows多媒体API的非托管waveOut*方法,并从那里处理播放。

其他选项 - 我所知道的 - 使用waveOut直接,从这个:http://windowsmedianet.sourceforge.net/或者自己写的DirectShow源过滤器,但可能是太复杂了,因为它必须用C++编写。

如果您有兴趣尝试使用我的组件,我可以免费提供给您,因为我需要它进行beta测试(我只在几个项目中使用过它)。

编辑:

由于有6个upvotes这个问题,我提供我的组件免费的(如果你觉得有用的)位置:http://dl.dropbox.com/u/10020780/SimpleAudioPlayer.zip

也许你可以反省它:)

+0

再一次,大量的反应,也会看到这一点,一旦我尝试过它会给你反馈。干杯。 –

1

Alvas.Audio有3个音频播放器:Player

 player.FileName = "123.mp3"; 
     player.Play(); 

PlayerEx

 public static void TestPlayerEx() 
     { 
      PlayerEx plex = new PlayerEx(); 
      plex.Done += new PlayerEx.DoneEventHandler(plex_Done); 
      Mp3Reader mr = new Mp3Reader(File.OpenRead("in.mp3")); 
      IntPtr format = mr.ReadFormat(); 
      byte[] data = mr.ReadData(); 
      mr.Close(); 
      plex.OpenPlayer(format); 
      plex.AddData(data); 
      plex.StartPlay(); 
     } 

     static void plex_Done(object sender, DoneEventArgs e) 
     { 
      if (e.IsEndPlaying) 
      { 
       ((PlayerEx)sender).ClosePlayer(); 
      } 
     } 

RecordPlayer

 public static void TestRecordPlayer() 
     { 
      RecordPlayer rp = new RecordPlayer(); 
      rp.PropertyChanged += new PropertyChangedEventHandler(rp_PropertyChanged); 
      rp.Open(new Mp3Reader(File.OpenRead("in.mp3"))); 
      rp.Play(); 
     } 

     static void rp_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      switch (e.PropertyName) 
      { 
       case RecordPlayer.StateProperty: 
        RecordPlayer rp = ((RecordPlayer)sender); 
        if (rp.State == DeviceState.Stopped) 
        { 
         rp.Close(); 
        } 
        break; 
      } 
     }