我正在寻找一个C ++库(适用于Linux,但最好是跨平台),它可以轻松地让我以一些简单的格式读取音频文件,例如原始字节流,以相同的简单格式生成音频数据,以及写音频文件。我不在乎阅读和写作的格式,只要它是免费的(啤酒和语音)并且通常得到支持。我将在一个非常并行的程序中读取,转换和生成许多小音频片段,因此我需要快速且线程安全的库。
我想要的其他功能,但不需要,是简单的DSP功能(FFT,滤波器),以及通过声卡录制/播放。
一些谷歌搜索没有改变任何东西,但也许我使用了错误的搜索条件。我几乎完全找到用于记录或播放的应用程序的库,并且不清楚它们是否能够从原始字节生成声音,即使它们确实如此,它们似乎对我的目的而言也有些过分。我一直在考虑编写自己的库来操作WAV文件,因为它们看起来很简单,但如果我能避免它,我宁愿不重新发明轮子。
答案 0 :(得分:1)
我可能完全不在这里,但根据您的描述,您似乎在寻找OpenAL或FMOD之类的内容。 OpenAL是完全免费的,但FMOD仅供非商业用途免费使用。两者都是线程安全的,并且是跨平台的。
你可以猜到,由于缺乏(好的)文档和适当的例子,开始使用OpenAL比FMOD困难得多。
答案 1 :(得分:1)
答案 2 :(得分:1)
GStreamer是跨平台的并且被广泛使用:
GStreamer是一个用于构建媒体处理组件图的库。它支持的应用范围从简单的Ogg / Vorbis播放,音频/视频流到复杂的音频(混合)和视频(非线性编辑)处理。
答案 3 :(得分:0)
答案 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。只需看看第一篇教程。它们非常简短,直接。