【问题标题】:Playing Audio in .Net / C#在 .Net / C# 中播放音频
【发布时间】:2011-10-08 00:47:48
【问题描述】:

我是一名多年经验丰富的 MFC 程序员,最近几年一直在用 Objective C 为 Mac 和 iOS 开发商业应用程序 - 我正在努力跟上 .Net 和 C# 的速度(因为我'很快将需要将我的一个商业应用程序从 Mac 转换为 PC)。

我现在已经阅读了几本书,作为练习以更熟悉 .Net(和 C#),我决定尝试将我的一个非商业应用程序转换为 .Net,因为一个学习练习,一切顺利(界面正常,数据结构都很好),但我需要能够播放音频。

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

我需要在 PC 上做同样的事情。不幸的是,我发现 MSDN 文档是一个“只见树木不见森林”的案例,因为有如此大量的文档。我可以找到可以让我加载和播放 mp3/wav 等文件的类,但我需要实时生成音频。谁能指出我正确的方向以找到可以让我在播放缓冲区时动态填充缓冲区的内容?

谢谢

【问题讨论】:

标签: c# audio buffer playback


【解决方案1】:

我使用Audiere 来完成这项工作,发现效果很好。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      编辑:

      由于该问题有 6 人赞成,我将在此处免费提供我的组件(如果您觉得有用):http://dl.dropbox.com/u/10020780/SimpleAudioPlayer.zip

      也许你可以反思一下:)

      【讨论】:

      • 再一次,大量的回复,也会看看这个,一旦我尝试过会给你反馈。干杯。
      【解决方案4】:

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

      【讨论】:

      • 都非常有用,NAudio 网站上的 Sine wave 演示似乎完全符合我的要求,我应该能够修改该代码并得到我需要的结果,非常感谢!跨度>
      • 大约一个小时后,NAudio 启动并运行并完美运行 - 我的应用程序现在具有表现力!非常感谢您的建议! :O)
      【解决方案5】:

      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;
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 2011-03-30
        • 2016-10-12
        • 2012-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多