一、初步认识OpenAL官方库 OpenAL: Cross Platform 3D Audio
1.0 介绍
OpenAL(Open Audio Library)是一个跨平台的3D音频API(应用程序编程接口),用于在计算机程序中创建高品质的音频效果。它由开放式的标准实现,并支持各种操作系统,如Windows、macOS、Linux、iOS和Android等。OpenAL提供了一种标准的方式,用于访问计算机音频设备,并使用3D音频技术来模拟音频在三维空间中的传播。
OpenAL支持多种音频格式,包括WAV、MP3和OGG等,同时还可以使用DSP(数字信号处理)效果和音频过滤器来改善音频质量和效果。此外,OpenAL还提供了一个简单的接口来创建、操纵和播放音频源,使得开发人员可以轻松地创建各种音频效果,如回声、延迟和混响等。
2.0 官网下载
3.0 SDk理解
SDK代表“Software Development Kit”,是一组用于开发特定软件或应用程序的软件工具集。SDK通常包括编译器、调试器、库、API文档、示例代码和其他有助于开发人员创建软件的工具和资源。使用SDK可以简化软件开发过程,使开发人员能够更轻松地创建和测试他们的软件,并为其他开发人员提供一种简单的方法来集成和扩展该软件。SDK通常是针对特定的平台、操作系统或开发语言而设计的,例如Android SDK、iOS SDK、Windows SDK、Java SDK等等。
4.0 zip区别
OpenAL 1.1 Windows Installer (zip) OpenAL 1.1 Core SDK (zip) 区别
-
OpenAL 1.1 Windows Installer (zip)
是一个包含Windows安装程序的压缩文件,它提供了一个易于安装和使用的OpenAL库,可以直接在Windows系统上运行。 -
OpenAL 1.1 Core SDK (zip)
是一个包含OpenAL源代码和相关文件的压缩文件,它包括了用于构建OpenAL库的工具和示例代码,以及其他开发者所需的文件。该SDK可以用于构建自定义版本的OpenAL库,或者为其他平台或应用程序定制OpenAL库。
5.0扩展库:
6.0 OpenAL 1.1 Windows Installer 和 libsndfile-1.0.28-w32-setup.exe 区别
OpenAL 1.1 Windows Installer是安装OpenAL的Windows安装程序。OpenAL是一种用于3D音频渲染的跨平台API,允许应用程序在游戏、虚拟现实和其他音频相关应用中创建具有空间感的声音。安装程序将在Windows系统中安装OpenAL库,以便应用程序可以调用其中的功能。
libsndfile-1.0.28-w32-setup.exe是安装libsndfile的Windows安装程序。libsndfile是一个用于读取和写入许多不同音频格式的库。它提供了一组API,允许应用程序读取和写入各种音频文件格式,例如WAV,AIFF和MP3等。
这两个安装程序提供的库功能不同,而且可以在应用程序中一起使用。如果你需要在你的应用程序中使用OpenAL,则需要安装OpenAL 1.1 Windows Installer。如果你需要在你的应用程序中读取或写入不同的音频文件格式,则需要安装libsndfile-1.0.28-w32-setup.exe。
7.0 OpenAL 1.1 Windows Installer 和 OpenAL Soft 区别
OpenAL 1.1 Windows Installer是一个由Creative Labs开发的OpenAL实现。它是一个用于多媒体应用程序的开放式跨平台3D音频API。它是用于Windows平台的OpenAL实现的一个可执行文件,包含用于安装和配置OpenAL库的程序。它支持多个平台,并且与各种音频硬件和软件兼容。
OpenAL Soft是一个替代的、开源的OpenAL实现。它与Creative Labs的OpenAL实现兼容,并提供更多的功能和灵活性。OpenAL Soft支持许多平台,包括Windows、Linux、Mac OS X等,并且能够运行在多个处理器架构上。它的优点包括更好的可移植性、更好的性能、更好的音频品质和更好的灵活性。它还支持许多额外的功能,例如HRTF(头部相关转移函数)和EAX(环境音效)扩展。
因此,OpenAL 1.1 Windows Installer是由Creative Labs开发的官方实现,而OpenAL Soft是一个替代的开源实现。如果您只需要基本的OpenAL功能,那么OpenAL 1.1 Windows Installer就足够了。但是,如果您需要更多的功能和灵活性,或者需要在不同平台之间移植,那么OpenAL Soft可能更适合您的需求。
soft库:
https://openal-soft.org/openal-binaries/openal-soft-1.23.1-bin.zip
二、编译 (OpenAL 1.1 Core SDK (zip) 和soft库)
1.0 OpenAL 1.1 Core SDK (zip) 配置
2.0 打开立体声
#include <al.h>
#include <alc.h>
#include <iostream>
int main() {
// 初始化OpenAL设备
ALCdevice* device = alcOpenDevice(nullptr);
if (!device) {
std::cerr << "Failed to open audio device." << std::endl;
return -1;
}
// 创建上下文
ALCcontext* context = alcCreateContext(device, nullptr);
if (!context) {
std::cerr << "Failed to create audio context." << std::endl;
alcCloseDevice(device);
return -1;
}
// 设置上下文
alcMakeContextCurrent(context);
// 创建源
ALuint source;
alGenSources(1, &source);
// 设置源属性
alSourcef(source, AL_PITCH, 1.0f); //设置声音的播放速度。默认值为1.0,表示正常速度。
alSourcef(source, AL_GAIN, 1.0f); //设置声音的增益或者说音量。默认值为1.0,表示最大音量。
alSource3f(source, AL_POSITION, -1.0f, 0.0f, 0.0f); //设置源在3D空间中的位置。这里将源放在了(-1, 0, 0)的位置。
alSource3f(source, AL_VELOCITY, -1.0f, 0.0f, 0.0f); //设置源在3D空间中的速度。这里设置源的速度为(-1, 0, 0)。
alSourcei(source, AL_LOOPING, AL_TRUE); //设置源是否循环播放。这里将源的循环属性设置为AL_TRUE,表示循环播放。
// 创建缓冲区
ALuint buffer;
alGenBuffers(1, &buffer);
// 加载音频文件
const char* filename = "ds_china.wav";
FILE* fp = nullptr;
fopen_s(&fp, filename, "rb");
if (!fp) {
std::cerr << "Failed to open audio file." << std::endl;
return -1;
}
// 读取音频数据
fseek(fp, 0, SEEK_END);
long file_size = ftell(fp);
fseek(fp, 0, SEEK_SET);
char* file_data = new char[file_size];
fread(file_data, 1, file_size, fp);
fclose(fp);
// 将音频数据存入缓冲区
alBufferData(buffer, AL_FORMAT_STEREO16, file_data, file_size, 44100);
// 将缓冲区连接到源
alSourcei(source, AL_BUFFER, buffer);
// 播放音频
alSourcePlay(source);
// 等待音频播放完毕
ALint state;
do {
alGetSourcei(source, AL_SOURCE_STATE, &state);
} while (state == AL_PLAYING);
// 删除资源
alDeleteSources(1, &source);
alDeleteBuffers(1, &buffer);
alcMakeContextCurrent(nullptr);
alcDestroyContext(context);
alcCloseDevice(device);
// 释放内存
delete[] file_data;
return 0;
}
3.0 soft扩展库 和 libsndfile-1 库 配置
4.0 soft 案例
#include <iostream>
#include <cstring>
#include <sndfile.h>
#include <AL/al.h>
#include <AL/alc.h>
#include <vector>
using namespace std;
int main() {
const char* filename = "sample.wav"; // 将路径替换为您的 WAV 文件路径
SF_INFO sfinfo;
memset(&sfinfo, 0, sizeof(sfinfo));
//使用SF_INFO结构体获取音频文件的信息,例如通道数、采样率和帧数等等
SNDFILE* sndfile = sf_open(filename, SFM_READ, &sfinfo);
if (!sndfile) {
cerr << "Error: Failed to open file " << filename << endl;
return 1;
}
cout << "File: " << filename << endl;
cout << "Channels: " << sfinfo.channels << endl;
cout << "Sample Rate: " << sfinfo.samplerate << endl;
cout << "Frames: " << sfinfo.frames << endl;
vector<ALshort> data(sfinfo.frames * sfinfo.channels);
if (sf_read_short(sndfile, data.data(), data.size()) < 1) {
cerr << "Error: Failed to read file " << filename << endl;
return 1;
}
sf_close(sndfile);
//打开设备
ALCdevice* device = alcOpenDevice(nullptr);
if (!device) {
cerr << "Error: Failed to open OpenAL device" << endl;
return 1;
}
//创建OpenAL上下文
ALCcontext* context = alcCreateContext(device, nullptr);
if (!context) {
cerr << "Error: Failed to create OpenAL context" << endl;
alcCloseDevice(device);
return 1;
}
alcMakeContextCurrent(context);
ALuint buffer = 0;
alGenBuffers(1, &buffer);
//将音频数据填充到缓冲区中
alBufferData(buffer, sfinfo.channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, data.data(), data.size() * sizeof(ALshort), sfinfo.samplerate);
//使用alGenSources()函数生成一个音频源,并使用alSourcei()函数将音频缓冲区绑定到音频源上
ALuint source = 0;
alGenSources(1, &source);
alSourcei(source, AL_BUFFER, buffer);
alSourcePlay(source);
ALint state;
do {
alGetSourcei(source, AL_SOURCE_STATE, &state);
} while (state == AL_PLAYING);
alDeleteSources(1, &source);
alDeleteBuffers(1, &buffer);
alcMakeContextCurrent(nullptr);
alcDestroyContext(context);
alcCloseDevice(device);
return 0;
}
三、soft源码Cmake编译
1.感兴趣可以搜下Cmake 编译
2.库替换自己编译的,附加到进程可以调试源码,感兴趣可以搜下如何附加到进程
3.wav资源, 在day01 SDL 下载的源码里面
4.测试案例涉及到wav资源的查看,现在用的是VLC,学习音视频必备,官网下载一下