我想编写一个可以实时处理和回放麦克风数据的跨平台应用程序.想象一下,作为一个概念证明,一个聊天室,人们可以互相交谈并对他们的声音应用过滤器.OpenAL适合这个吗?如果没有,有人可以提供替代方案吗?此外,如果任何人都可以提供或链接我一个简单的"hello world"程序,该程序从麦克风读取并将输出吐出,那将是非常棒的.
谢谢!
我想这样做很简单:从内存播放PCM音频数据.
音频样本将来自声音合成算法,预加载的样本文件或其他任何内容.我的问题是关于如何播放缓冲区,而不是如何填充数据.
所以我在寻找最好的方式来重新实现我老了,过时AudioWrapper(这是基于AudioUnits V1),但我不能在发现苹果的文档,将履行以下的API:
我正在考虑使用OpenAL,但它真的是最好的选择吗?我看过它的负面看法,它可能过于复杂和过度,可能会增加性能开销?
更糟糕的是,我可以有两个不同的AudioWrapper实现,但如果可能的话,我真的想避免为每个系统安装一个版本(ios,10.5,10.6,10.7 ......).此外,它将在C++中.
编辑:我需要一个良好的延迟,系统必须在20毫秒内响应用户交互(缓冲区必须介于128到512个样本之间,44KHz)
每当我播放音效时,我都会使用:
alSourcei(sources[index], AL_BUFFER, 0); alSourcei(sources[index], AL_BUFFER, bufferID); alSourcef(sources[index], AL_PITCH, 1.0); alSourcef(sources[index], AL_GAIN, 1.0);
每次播放声音效果时,删除设置AL_PITCH和AL_GAIN会是一个重要的优化吗?显然,因为当我初始化声音时,每次我只能设置它一次是1.0.如果没有设置,AL_PITCH和AL_GAIN默认为什么值?
我正在寻找一种方法来接入Mac上的当前音频输出,然后返回表示当前声级的值.
声级是指输出产生的噪音量.我不是问如何获得输出设备的当前音量级别.
我正在尝试制作一个可以同时播放7种声音的c ++程序.为此,我有7个由Qt Designer 5.3.1组成的播放按钮,每当我点击一个按钮时,它就会将声音加载到相应的缓冲区.我正在使用OpenAL播放声音.检查声音文件后,如果它是wav文件,我使用以下代码将数据加载到缓冲区:
//now we put our data into the openAL buffer and
//check for success
if (ui->groupBox_2->isHidden() == true) //play button is in the groupbox, so I'm using groupbox.
{
alGetError();
alBufferData(buffer[0], *format, data, *size, *freq);
}
else if (ui->groupBox_5->isHidden() == true)
{
alGetError();
alBufferData(buffer[1], *format, data, *size, *freq);
}
else if (ui->groupBox_14->isHidden() == true)
{
alGetError();
alBufferData(buffer[2], *format, data, *size, *freq);
}
else if (ui->groupBox_23->isHidden() == true)
{
alGetError();
alBufferData(buffer[3], *format, data, *size, *freq);
}
else if …Run Code Online (Sandbox Code Playgroud) 我正在尝试加载.WAV文件以与OpenAL一起播放。我正在跟踪我在互联网上找到的示例,但它的行为很奇怪。这是代码:
struct RIFF_Header {
char chunkID[4];
long chunkSize;//size not including chunkSize or chunkID
char format[4];
};
/*
* Struct to hold fmt subchunk data for WAVE files.
*/
struct WAVE_Format {
char subChunkID[4];
long subChunkSize;
short audioFormat;
short numChannels;
long sampleRate;
long byteRate;
short blockAlign;
short bitsPerSample;
};
/*
* Struct to hold the data of the wave file
*/
struct WAVE_Data {
char subChunkID[4]; //should contain the word data
long subChunk2Size; //Stores the size of the data block
}; …Run Code Online (Sandbox Code Playgroud) 来自 OpenAL 文档:
基本的 OpenAL 对象是监听器、源和缓冲区。可以有大量的Buffer,其中包含音频数据。每个缓冲区可以附加到一个或多个源
我的问题是,我有一个声音文件,我需要每秒同时播放多次。声音时长2秒。所以会重叠。
我是否需要为此填充多个缓冲区(=内存中声音的多次)?
如果我将一个缓冲区附加到多个源,我是否能够播放声音 10 次(重叠),而内存中只有一份副本?或者我仍然需要在内存中处理该声音的 10 个副本吗?
OpenAL 1.1 中不推荐使用以下函数调用,什么是正确的替换?我在谷歌上找到的唯一答案是“编写你自己的函数!!” ;-)
alutLoadWAVFile
alutUnloadWAV
Run Code Online (Sandbox Code Playgroud) 我试图找到一种方法让OpenAL在我的电脑上工作:
Ubuntu 12.10 (running on 2010 intel i7 Macbook Pro)
Run Code Online (Sandbox Code Playgroud)
我从终端安装了OpenAL库:
$ sudo apt-get install libopenal-dev
Run Code Online (Sandbox Code Playgroud)
一切顺利.现在我尝试创建一个简单的C++程序,其中包含库:
#include <iostream>
#include <AL/alut.h>
using namespace std;
int main(){
cout << "Hello, world" << endl;
}
Run Code Online (Sandbox Code Playgroud)
无论我怎么努力,我最接近找到如何使用g ++编译它是:
$ g++ test.cpp -lalut
Run Code Online (Sandbox Code Playgroud)
这会出现以下错误:
test.cpp:2:21: fatal error: AL/alut.h: No such file or directory
compilation terminated.
Run Code Online (Sandbox Code Playgroud)
关于如何将OpenAL链接到我的项目的任何想法?我花了几个小时在谷歌上,答案似乎不存在.我可能做了一些根本错误的事情,因为我对Linux c ++开发不熟悉.谢谢.
编辑:更改以供参考:
$ g++ -lalut test.cpp
Run Code Online (Sandbox Code Playgroud)
至
$ g++ test.cpp -lalut
Run Code Online (Sandbox Code Playgroud)
(后面是正确的做法,我发错了).
openal ×10
audio ×5
c++ ×3
core-audio ×2
ios ×2
macos ×2
cocoa ×1
cordova ×1
html5 ×1
iphone ×1
linker ×1
linux ×1
microphone ×1
objective-c ×1
openal-soft ×1
optimization ×1
real-time ×1
ubuntu ×1
wav ×1