在.net / c#中播放音频

本文关键字:播放 音频 net | 更新日期: 2023-09-27 18:02:22

我是一个有多年经验的MFC程序员,最近几年一直在Mac和iOS中开发商业应用程序-我正在努力跟上。net和c#的速度(因为我很快就要被要求将我的一个商业应用程序从Mac转换到PC)。

我现在已经完成了几本书,作为练习,以更加熟悉。net(和c#)我已经决定在我的一个非商业应用程序转换为。net作为一个学习练习,一切都很顺利(接口工作,数据结构都很好),但我需要能够播放音频。

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

我需要在PC上做同样的事情。不幸的是,我发现MSDN文档是一种"只见树木不见树木"的情况,因为有如此大量的文档。我可以找到可以让我加载和播放mp3/wav等文件的类,但我需要实时生成音频。有人能给我指出正确的方向,找到一些东西,让我在飞行中填补缓冲区,因为它播放他们?

Thx

在.net / c#中播放音频

我在几个项目中使用了这个示例,效果很好。它基本上是使用P/Invoke的Windows波形音频API的。net包装。其他选择:

  • NAudio
  • 声音播放器类来自。net框架

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

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

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

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

编辑:

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

也许你可以反思一下:)

我用Audiere来完成这个任务,发现它工作得很好。

它实际上是一个c++库,但是有一组c#可用的绑定。

>

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

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