5

我正在寻找一种跨平台(Windows、MacOSX 和 Linux 上的 .Net 和 Mono)方法来解码 wav、mp3 或 ogg 文件,以便我可以根据需要通过 DirectSound 或 OpenAL 播放解码的流。

可以解码 mp3 或 ogg 的解决方案就足够了 - 无需同时解码两者。如果它(或其他解决方案)也可以解码 wav,那将是理想的,但不是绝对必要的,因为我可能会将我的 wav 文件转换为 mp3 或 ogg。

只能解码wav文件的解决方案只是部分解决方案,但我会尽我所能。;-)

这是我已经看过的内容:

  • DirectSound 和 Alut 都支持 WAV 解码,但 Alut 已被弃用。
  • ffmpeg 几乎可以解码任何东西,但它似乎没有跨平台的通用稳定版本?
  • 我还没有尝试过 csvorbis,但它已经很老了,我不确定它的当前状态是什么。

非常欢迎您尝试说服我上述解决方案之一实际上是最佳选择。

谢谢。

4

8 回答 8

4

你没有提到你正在寻找的那种许可。我使用FMOD取得了出色的成绩,它可免费用于非商业项目。它播放多种格式,包括 ogg 和 mp3,并具有用于控制播放方式的广泛 API。它是跨平台的,就像您需要的那样。

FMOD很大程度上针对游戏;如果它已经具有出色的 3D 功能,我不会感到惊讶(尽管我不确定)。

如您所知,我非常喜欢,这主要是因为让一个空白的 C# 项目第一次播放 OGG 文件非常轻松。

于 2009-10-18T22:25:56.247 回答
1

您应该能够使用 System.Media.SoundPlayer 直接播放 .wav 文件。不确定这是否有助于您的用例。

于 2009-04-10T19:21:42.647 回答
1

对于 WAV 文件的简单支持,您可以在 mcs/class/System/System.Media/AudioData.cs 中查看单声道的实现(http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/System/System .媒体/)。

要解码 ogg 音频文件,您可以查看 mono 的 sn 服务器中的 csvorbis 模块:http: //anonsvn.mono-project.com/viewvc/trunk/csvorbis/

于 2009-04-11T07:52:30.533 回答
0

我与 ffmpeg 一起工作,到目前为止我喜欢它。是的,跨版本几乎没有问题,但它是最有效的。

于 2009-04-10T19:20:05.850 回答
0

为了部分回答我自己的问题,事实证明编写自己的 WAV 加载器非常容易。我使用了这篇描述 wav 文件格式的文章:

http://www.sonicspot.com/guide/wavefiles.html

于 2009-04-11T12:58:49.253 回答
0

与往常一样,fmod 是您的答案...请随时在http://www.fmod.org/index.php/download#FMODExProgrammersAPI上解决您的所有问题

于 2010-03-19T01:50:54.513 回答
0

wav 文件具有结构 44 字节的起始音频信号。如果读取 44-to end 文件音频数据(wav 文件)你已经在 .NET(opeanl)中播放你的音乐 https://dpaste.com/8VNKMAUU5

public static void playwav()
    {
        Console.WriteLine("Hello World!");

        OpenTK.Audio.OpenAL.ALDevice device = OpenTK.Audio.OpenAL.ALDevice.Null;
        OpenTK.Audio.OpenAL.ALContext ctx = OpenTK.Audio.OpenAL.ALContext.Null;

        string defname = OpenTK.Audio.OpenAL.ALC.GetString(device, OpenTK.Audio.OpenAL.AlcGetString.DefaultDeviceSpecifier);
        Console.WriteLine(defname);
        device = OpenTK.Audio.OpenAL.ALC.OpenDevice(defname);

        if (!OpenTK.Audio.OpenAL.ALC.IsExtensionPresent(device, "ALC_EXT_EFX"))
            return;
        int[] atrributes = { 0, 0, 0, 0 };
        int[] iSends = { 0 };
        atrributes[0] = ((int)OpenTK.Audio.OpenAL.AlcContextAttributes.EfxMaxAuxiliarySends);
        atrributes[1] = 4;

        Console.WriteLine("EFX Extension found!\n");

        ctx = OpenTK.Audio.OpenAL.ALC.CreateContext(device, atrributes);

        OpenTK.Audio.OpenAL.ALC.MakeContextCurrent(ctx);
        OpenTK.Audio.OpenAL.ALC.ProcessContext(ctx);

        OpenTK.Audio.OpenAL.ALC.GetInteger(device, OpenTK.Audio.OpenAL.AlcGetInteger.EfxMaxAuxiliarySends, 1, iSends);


        //OpenTK.Audio.OpenAL.AL.GetProcAddress("LPALGENEFFECTS"); 

        int buffer;

        string str = @"C:\WorkC#\ConsoleApp3\ConsoleApp3\20211222-204048_.wav";
        //Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle("20211222-204048_.wav",true);
        FileStream fileStream = File.OpenRead(str);

        byte[] bufdata = new byte[fileStream.Length];
        //bufdata[0] = 0;
        byte[] RIFF = new byte[4];
        byte[] sizeRid = new byte[4];
        byte[] WAVE = new byte[4];
        byte[] FMT = new byte[4];
        fileStream.Read(RIFF, 0, 4);
        fileStream.Read(sizeRid, 0, 4);
        fileStream.Read(WAVE, 0, 4);
        fileStream.Read(FMT, 0, 4);

        fileStream.Read(bufdata, 44, (int)(fileStream.Length - 45));

        OpenTK.Audio.OpenAL.AL.GenBuffer(out buffer);

        UInt16 value = BitConverter.ToUInt16(RIFF, 0);

        Console.WriteLine(((char)value));
        Console.WriteLine(sizeRid.Length);
        Console.WriteLine(WAVE.Length);
        OpenTK.Audio.OpenAL.AL.BufferData(buffer, OpenTK.Audio.OpenAL.ALFormat.Stereo16, bufdata, 44100);

        Console.WriteLine((bufdata));

        int src;
        OpenTK.Audio.OpenAL.AL.GenSource(out src);
        OpenTK.Audio.OpenAL.AL.Source(src, OpenTK.Audio.OpenAL.ALSourcei.Buffer, buffer);
        OpenTK.Audio.OpenAL.AL.SourcePlay(src);
        int state = 4114;

        while (state == (int)OpenTK.Audio.OpenAL.ALSourceState.Playing)
        {
            OpenTK.Audio.OpenAL.AL.GetSource(src, OpenTK.Audio.OpenAL.ALGetSourcei.SourceState, out state);
            Console.Write(state + "\r");
            //int state = (int)OpenTK.Audio.OpenAL.ALSourceState.Playing;
            //OpenTK.Audio.OpenAL.AL.SourcePlay(src);
        }


        OpenTK.Audio.OpenAL.ALC.DestroyContext(ctx);
        OpenTK.Audio.OpenAL.ALC.CloseDevice(device);



        //OpenTK.Audio.OpenAL.ALC.GetContextsDevice();
    }
于 2021-12-25T15:00:01.850 回答
-1

https://sites.google.com/site/cobnut3d/

SlimDX.DirectSound - 是 C# 的代码示例。

于 2015-05-29T02:23:46.220 回答