【问题标题】:C++ library for generating and reading audio用于生成和读取音频的 C++ 库
【发布时间】:2012-02-19 04:52:38
【问题描述】:

我正在寻找一个 C++ 库(适用于 Linux,但最好是跨平台的),它可以让我轻松读取一些普通格式的音频文件,例如原始字节流,生成相同普通格式的音频数据,以及写音频文件。我不在乎阅读和写作的格式是什么,只要它是免费的(啤酒和语音)并且得到普遍支持。我将在一个非常并行的程序中读取、转换和生成许多小的音频剪辑,因此我需要该库是快速且线程安全的。

我想要但不需要的其他功能是简单的 DSP 功能(FFT、过滤器)以及通过声卡进行录制/播放。

谷歌搜索并没有发现任何问题,但也许我使用了错误的搜索词。我几乎只找到了用于记录或播放的应用程序的库,目前还不清楚它们是否有能力从原始字节生成声音,即使它们对我的目的来说似乎有点矫枉过正。我一直在考虑编写自己的库来操作 WAV 文件,因为它们看起来很简单,但如果可以避免的话,我宁愿不重新发明轮子。

【问题讨论】:

  • 我知道你说过你想要 C++ 以提高速度,但我建议使用 octave 进行原型设计,然后移植到 C++ 以提高速度gnu.org/software/octave/doc/interpreter/Audio-Processing.html。对于 C++,您可以使用 PortAudio portaudio.com/docs.html
  • @TJD:大部分繁重的处理都将使用遗传算法完成,因此没有太多原型设计可做,而且我认为 octave 不太适合该任务.
  • @Samaursa:我还没有决定这是商业项目还是开源项目,或者只是一个爱好项目......这可能取决于它的成功程度。最好是免费的所有用途许可证。

标签: c++ linux audio


【解决方案1】:

我可能完全不在此列,但从您的描述看来,您正在寻找类似OpenALFMOD 的东西。 OpenAL 完全免费,但 FMOD 仅可免费用于非商业用途。两者都是线程安全的并且是跨平台的。

您可以猜到,由于缺乏(好的)文档和适当的示例,因此开始使用 OpenAL 比 FMOD 困难得多。

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      GStreamer 是跨平台且被广泛使用的:

      GStreamer 是一个用于构建媒体处理组件图的库。它支持的应用范围从简单的 Ogg/Vorbis 播放、音频/视频流到复杂的音频(混合)和视频(非线性编辑)处理。

      【讨论】:

        【解决方案4】:

        我建议尝试 STK: https://ccrma.stanford.edu/software/stk/ 您可以将所需的内容复制到程序中(比如说读写 .wav 文件)。使用起来相当简单。它有教程(带有 C++ 代码)。他们说它是跨平台的。如果您要为 Linux 编译它,请记住将“-D__LITTLE_ENDIAN__”添加到您的 g++ 命令行。

        附:看看第一个教程。它们真的很短,简单明了。

        【讨论】:

          【解决方案5】:

          SDLSDL_Mixer 怎么样?但是没有 DSP 功能。

          【讨论】:

            【解决方案6】:

            看看 BASS 库 www.un4seen.com
            BASS免费用于非商业用途。

            平台:Win32、OSX、Linux
            BASS 也可用于 Win64、WinCE、iOS、Android 和 ARM Linux 平台。

            BASS 是一个音频库,可在多个平台上的软件中使用。它的 目的是为开发者提供强大高效的sample, 流(MP3、MP2、MP1、OGG、WAV、AIFF、自定义生成等,通过 OS 编解码器和附加组件)、MOD 音乐(XM、IT、S3M、MOD、MTM、UMX)、MO3 音乐(MP3/OGG​​ 压缩 MOD)和录音功能。全部在一个 紧凑的 DLL/LIB,不会使您的发行版膨胀。

            BASS 支持大量插件,易于使用、灵活、良好的文档/示例以及我见过的最好的支持。

            如您所愿:
            自定义生成的示例
            还有 WAV/AIFF/MP3/MP2/MP1/OGG
            示例:创建一个 440hz 正弦波样本。

            HSAMPLE sample=BASS_SampleCreate(256, 28160, 1, 1, 
            BASS_SAMPLE_LOOP|BASS_SAMPLE_OVER_POS); // create sample
            short data[128]; // data buffer
            int a;
            for (a=0; a<128; a++)
                data[a]=(short)(32767.0*sin((double)a*6.283185/64)); // sine wave
            BASS_SampleSetData(sample, data); // set the sample's data
            

            通过声卡播放
            同时使用多个声卡,并在它们之间移动通道

            自定义 DSP
            按您想要的任何顺序应用您想要的任何效果
            DSP 设置使用:

            HDSP BASS_ChannelSetDSP(
                DWORD handle,
                DSPPROC *proc,
                void *user,
                int priority
            );
            

            示例:一个简单的 DSP 函数,用于交换立体声 16 位声道的左/右声道。

            void CALLBACK SwapDSP(HDSP handle, DWORD channel, void *buffer, DWORD length, void *user)
            {
                short *s=buffer;
                for (; length; length-=4, s+=2) {
                    short temp=s[0];
                    s[0]=s[1];
                    s[1]=temp;
                }
            }
            

            录音
            灵活的录制系统,支持多种设备和输入选择,(通过插件进行 WMA 编码和广播,通过 BASSenc 进行其他格式)

            FFT
            示例:在通道上执行 1024 样本 FFT 并列出结果。

            float fft[512]; // fft data buffer
            BASS_ChannelGetData(channel, fft, BASS_DATA_FFT1024);
            for (int a=0; a<512; a++)
                printf("%d: %f\n", a, fft[a]);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-05
              • 2013-11-30
              • 2013-03-30
              • 1970-01-01
              • 2010-11-24
              • 2019-08-14
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多