day03 OpenAL 编译及案例(windows)

一、初步认识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扩展库:

libsndfile

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,学习音视频必备,官网下载一下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ALUT(OpenAL Utility Toolkit)是一个用于OpenAL的工具包,它提供了一些方便的函数来简化OpenAL的使用。下面是使用ALUT库的步骤: 1. 下载OpenAL-Soft库,可以从官网下载:https://www.openal.org/downloads/ 。 2. 下载ALUT库,可以从官网下载:https://github.com/vancegroup/freealut/releases 。 3. 解压OpenAL-Soft和ALUT库。 4. 进入OpenAL-Soft源码目录,建立build目录(如果没有),进入build目录,执行cmake ..,生成vs2019工程文件OpenAl.sln。 5. 用vs2019打开OpenAl.sln工程文件,编译64位目标文件。 6. 在你的代码中包含AL/alut.h头文件。 7. 在你的代码中使用ALUT库提供的函数,例如alutInit()、alutCreateBufferFromFile()、alutCreateSource()等。 8. 在你的代码中使用OpenAL库提供的函数,例如alGenSources()、alSourcei()、alSourcePlay()等。 下面是一个使用ALUT库的例子: ```c #include <AL/alut.h> #include <AL/al.h> int main(int argc, char **argv) { // 初始化ALUT库 alutInit(&argc, argv); // 创建一个缓冲区并从文件中读取数据 ALuint buffer = alutCreateBufferFromFile("sound.wav"); // 创建一个源并将缓冲区分配给它 ALuint source; 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); alutExit(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值