OpenAL(开放音频库)是一种跨平台音频API,可以高效渲染环境,3D位置音频。
我正在使用OpenTK,更准确地说是OpenAL。我能够从麦克风捕获声音,但随后我想将数据保存到 WAVE 文件中。 我找到了一个如何编写波形文件的示例,结果是......
大家好,我在尝试让 openAL 在我的 c++ 程序中工作时遇到了麻烦。我已经安装了 oalinst 和 ALUT(Windows 二进制),但是当我尝试编译/运行我的程序(使用 Qt Creator)时,我得到...
Android NDK:使用 OpenAL 共享库时出现 UnsatisfiedLinkError
我正在尝试在Android中使用手动编译的OpenAL共享库。 包括 $(CLEAR_VARS) LOCAL_MODULE:=开放 LOCAL_SRC_FILES:=../mylibs/libopenal.so LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/in...
我对 Linux 和 Linux 编程非常陌生。我正在尝试在 ubuntu 上安装 OpenAL SDK ...我最好的猜测是我需要从 CVS 存储库下载 OpenAL。我找到了一个教程:http://www.
我正在尝试用 openal 实现空间声音,但是无论我如何改变源的位置,声音的音量都不会改变。这是一些示例代码: #包括 我正在尝试用 openal 实现空间声音,但是无论我如何改变源的位置,声音的音量都不会改变。这是一些示例代码: #include <chrono> #include <AL/al.h> #include <AL/alc.h> #include "stb_vorbis.c" double timeDiff(std::chrono::steady_clock::time_point start, std::chrono::steady_clock::time_point stop) { auto dur = std::chrono::duration_cast<std::chrono::duration<double>>(stop - start); return dur.count(); } int main(void) { auto audioDevice = alcOpenDevice(nullptr); auto alContext = alcCreateContext(audioDevice, nullptr); alcMakeContextCurrent(alContext); alDistanceModel(AL_LINEAR_DISTANCE_CLAMPED); ALuint source = 0; alGenSources(1, &source); alSourcei(source, AL_SOURCE_RELATIVE, AL_TRUE); // Added max distance and reference distance, thanks to paddy's comment alSourcef(source, AL_MAX_DISTANCE, 50.f); alSourcef(source, AL_REFERENCE_DISTANCE, 5.f); ALuint buffer = 0; alGenBuffers(1, &buffer); { int spacialAudioChannels = 0, sampleRate = 0; short* hData = nullptr; int samples = stb_vorbis_decode_filename("Cipher2.ogg", &spacialAudioChannels, &sampleRate, &hData); if (hData == nullptr) { printf("Failed to open file Cipher2.ogg"); exit(EXIT_FAILURE); } auto alFormat = spacialAudioChannels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16; alBufferData(buffer, alFormat, hData, samples * sizeof(short), sampleRate); free(hData); } alSourcei(source, AL_BUFFER, buffer); alSourcePlay(source); auto startTime = std::chrono::steady_clock::now(); while (timeDiff(startTime, std::chrono::steady_clock::now()) < 180.0) { double percentElasped = timeDiff(startTime, std::chrono::steady_clock::now()) / 180.0; float pos[] = { percentElasped * 100.f, 0.f, 0.f }; alSourcefv(source, AL_POSITION, pos); } } 我正在使用 stb vorbis 加载 ogg 文件。然后我计算已经过去的时间百分比,最后将源位置设置为该百分比。 这应该会产生声源远离听者的效果,并使声音随着时间的推移变得更安静。问题是音量保持不变。 我下载并安装了最新的 OpenAL SDK (Windows) 并复制了您的代码。我没有乱搞音频文件,而是生成了 5 秒单声道 440Hz 波形。这工作正常。 所以,我决定尝试立体声,发现它根本没有衰减。在阅读 alBufferData 的 documentation 时,我在备注部分看到以下评论: 包含多个数据通道的缓冲区 将在没有 3D 空间化的情况下播放。 我想说这可能是您问题的症结所在。您可能有一个立体声音频文件。尝试将其转换为单声道。 这是我的测试程序,它将音频源从最左移动到最右: #include <cmath> #include <chrono> #include <vector> #include "al.h" #include "alc.h" template <typename T, typename TimePoint> T timeDiff(TimePoint start, TimePoint stop) { auto dur = std::chrono::duration_cast<std::chrono::duration<T>>(stop - start); return dur.count(); } std::vector<short> generateWave(int sampleRate, float durationSeconds, float frequencyHz, bool stereo) { std::vector<short> samples; int numChannels = stereo + 1; int numSamples = static_cast<int>(sampleRate * durationSeconds) * numChannels; samples.reserve(numSamples); for (int t = 0; t < numSamples; t++) { double amplitude = sin(3.1415927 * 2.0 * frequencyHz * t / sampleRate / numChannels); samples.push_back(static_cast<short>(amplitude * 32767)); } return samples; } int main() { using Clock = std::chrono::steady_clock; const bool stereo = false; const int sampleRate = 44100; const float waveFrequencyHz = 440.f; const float playTimeSeconds = 5.f; const float maxDistance = 50.f; const float refDistance = 5.f; // Init device context auto audioDevice = alcOpenDevice(nullptr); auto alContext = alcCreateContext(audioDevice, nullptr); alcMakeContextCurrent(alContext); alDistanceModel(AL_LINEAR_DISTANCE_CLAMPED); // Create audio source ALuint source = 0; alGenSources(1, &source); alSourcei(source, AL_SOURCE_RELATIVE, AL_TRUE); // Added max distance and reference distance, thanks to paddy's comment alSourcef(source, AL_MAX_DISTANCE, maxDistance); alSourcef(source, AL_REFERENCE_DISTANCE, refDistance); // Create audio buffer ALuint buffer = 0; alGenBuffers(1, &buffer); std::vector<short> samples = generateWave(sampleRate, playTimeSeconds, waveFrequencyHz, stereo); alBufferData(buffer, stereo ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16, samples.data(), (ALsizei)samples.size() * sizeof(short), sampleRate); // Play audio source alSourcei(source, AL_BUFFER, buffer); alSourcePlay(source); // Animate the audio source from far-left to far-right auto startTime = Clock::now(); for (float elapsed = 0; elapsed < playTimeSeconds; elapsed = timeDiff<float>(startTime, Clock::now())) { float t = elapsed / playTimeSeconds; float x = (t * 2.f - 1.f) * maxDistance; float pos[] = { x, 0, refDistance }; // offset z to avoid artifacts transitioning through origin alSourcefv(source, AL_POSITION, pos); } }
“* 缺少(或损坏)C 库:OpenAL32” - 来自 haskell 项目的堆栈构建
我有一个使用 Sound.ALUT 的堆栈项目。在添加声音之前,该项目在 Windows 和 Mac 上都运行良好。 (Sound.ALUT 是一个位于 OpenAL 之上的库。)Got 考虑在 MacOS 上工作,但是
我正在尝试用 Haskell 编写一个输出音频的程序。我决定使用 OpenAL 作为音频后端,考虑到我使用 OpenAL 的经验很少,这是我首先考虑的事情之一......
我在编译以下代码时遇到问题 #包括 #包括 #包括 int checkEnumerationSupport() { AL布尔枚举; 枚举...
如何通过我的应用程序交付 OpenAL32.dll,而不需要在客户端计算机上安装 OpenAL?
我有一个使用 OpenAL 库的 32 位 C++ Windows 应用程序。我正在使用官方 OpenAL 安装程序来安装所需的 DLL 文件,但是当我发布我的应用程序时,我想找到一个...
如何在 openal 中获取播放源的当前位置?我想我的意思是,音频经过缓冲区后当前在硬件上播放的位置,openal 的 buff...
如何构建 OpenAL-Soft 并在 Android 版 Qt Creator 中进行设置
我没有找到如何构建 OpenAL-Soft 以从 Qt for Android 使用它的分步指南。 我尝试通过将 OpenAL-Soft 源代码复制到项目中来实现。我将 OpenAL-Soft 源代码复制到我的
是否使用 alcMakeContextCurrent() 跨线程使用不同的 OpenAL 上下文,以确保对这些线程的每次调用都将始终引用相同的上下文?如果没有,我们可以“模拟”...
将AL_GAIN设置为0在iPhone6上有效,而不是iPad PRO?
为了让我的游戏在返回菜单时保持安静,我调用了这段代码:alListenerf( AL_GAIN, gain ); 这在Linux上工作得很好:游戏会安静下来。当我在iPad PRO上运行时,声音仍然是...
OpenAL:即使输入变量* look * OK,alBufferData也会返回AL_INVALID_VALUE?
因此,我正在构建一个线程IMA ADPCM解码器,将音频数据流传输到OpenAL(请参见下面的简短描述),但是遇到了一些麻烦。我的问题之一是有时我打给...
我正在使用OpenAL,当我调用alSourcePlay()时,我的声音缓冲区会“软启动”。我找不到从AL_GAIN开始的方法。图片显示了两个记录,第一个是我想要的记录(我有...
我正在用C ++编写一段音频包装器代码,以在XAudio2和OpenAL上具有抽象的API(稍后再介绍)。一切正常,我已经启动并运行系统,并提供...
我正在用C ++编写一个游戏引擎,该引擎利用SDL来处理图形,并使用OpenAL来处理音频。我正在使用MinGW编译和GDB调试的Windows XP上进行开发。我在运行...
我正在使用LWJGL 3进行游戏,这是我第一次学习OpenAL库。我将不得不包含长音频文件,并且我决定将OGG用于音频,...
如何强制OpenAL与libgdx中的pulseaudio接口? (适用于GNOME,但不适用于i3)
我对openAL和Pulseaudio有问题。当我运行原始生成的libgdx代码时,它可以正常工作。但是,当我启动音量控制GUI(pavucontrol)时,我收到一条消息,提示脉冲音频...