用于生成和读取音频的C ++库

时间:2012-01-26 00:06:00

标签: c++ linux audio

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

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

一些谷歌搜索没有改变任何东西,但也许我使用了错误的搜索条件。我几乎完全找到用于记录或播放的应用程序的库,并且不清楚它们是否能够从原始字节生成声音,即使它们确实如此,它们似乎对我的目的而言也有些过分。我一直在考虑编写自己的库来操作WAV文件,因为它们看起来很简单,但如果我能避免它,我宁愿不重新发明轮子。

6 个答案:

答案 0 :(得分:1)

我可能完全不在这里,但根据您的描述,您似乎在寻找OpenALFMOD之类的内容。 OpenAL是完全免费的,但FMOD仅供非商业用途免费使用。两者都是线程安全的,并且是跨平台的。

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

答案 1 :(得分:1)

答案 2 :(得分:1)

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

  

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

看看BASS图书馆www.un4seen.com
BASS 免费用于非商业用途。

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

  

BASS是一个音频库,可在多个平台上用于软件。它的   目的是为开发人员提供强大而有效的样本,   流(MP3,MP2,MP1,OGG,WAV,AIFF,自定义生成,以及更多通过   操作系统编解码器和附加组件),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]);

答案 5 :(得分:0)

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

P.S。只需看看第一篇教程。它们非常简短,直接。

相关问题