在.Net / C#中播放音频

时间:2011-07-18 20:53:38

标签: c# audio buffer playback

我是一位多年经验丰富的MFC程序员,近年来他一直在使用Objective C for Mac和iOS开发商业应用程序 - 我正在努力加快.Net和C#的速度(就像我一样)我很快就会被要求将我的一个商业应用程序从Mac转换为PC。

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

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

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

THX

5 个答案:

答案 0 :(得分:8)

我在几个项目中使用this sample并取得了良好的效果。它基本上是使用Windows Waveform Audio APIP/Invoke的.Net包装器。 其他选择:

答案 1 :(得分:3)

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

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

其他选项 - 我知道 - 直接使用waveOuthttp://windowsmedianet.sourceforge.net/或编写自己的DirectShow源过滤器,但这可能过于复杂,因为它必须写入C ++。

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

编辑:

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

也许你可以反思一下:)

答案 2 :(得分:2)

我使用Audiere来完成此任务并发现它非常有用。

它确实是一个C ++ lib,但C#有一个set of bindings

有关详细信息,请参阅the question I asked

答案 3 :(得分:2)

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

答案 4 :(得分: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;
            }
        }
相关问题