是为了更好地控制音效。

OpenAL构成

由三个实体构成:

  • listener(听众)
  • source(声源)
  • buffer(缓存)

OpenAL与3D空间中的声音

采用3D笛卡尔坐标系,右手坐标系。

OpenAL API

OpenAL应用开发流程

开始、获得设备信息、获得环境信息、初始化缓冲区、初始化声源、将缓冲区和声源绑定、初始化听众、播放、释放内存、结束。

其中初始化缓存是最为麻烦的,其详细过程是:

开始、打开文件、获得实际音频文件大小、开辟音频内存数据空间、读取文件到内存中、关闭文件、从OpenAL中获得缓冲区id、内存中音频数据复制到缓冲区、清除内存中音频数据、结束。

实例:使用OpenAL播放音效

#import "ViewController.h"
#import <AudioToolbox/AudioFile.h>
#import <OpenAL/al.h>
#import <OpenAL/alc.h>@interface ViewController (){ALCcontext *mContext;ALCdevice *mDevice;NSUInteger sourceID;NSUInteger bufferID;BOOL isPlaying;BOOL isLoop;
}@property (weak, nonatomic) IBOutlet UIButton *btnPlay;- (IBAction)play:(id)sender;
- (IBAction)switchLoop:(id)sender;-(void)initOpenAL;
-(void)initBuffer;
-(AudioFileID)openAudioFile:(NSString *)fileName;
-(UInt32)audioFileSize:(AudioFileID)fileID;@end@implementation ViewController- (void)viewDidLoad
{[super viewDidLoad];isPlaying = NO;[self initOpenAL];[self initBuffer];//从OpenAL中获得声源idalGenSources(1, &sourceID);//设置基本声源基本属性alSourcef(sourceID, AL_PITCH, 1.0f);//设置音高alSourcef(sourceID, AL_GAIN, 1.0f);//设置音量//将缓冲区和声源绑定alSourcei(sourceID, AL_BUFFER, bufferID);
}-(void)initOpenAL
{//获得设备mDevice = alcOpenDevice(NULL);if (mDevice){//使用设备创建一个环境对象mContext = alcCreateContext(mDevice, NULL);alcMakeContextCurrent(mContext);}
}-(void)initBuffer
{//获得文件的完整路径NSString *fileName = [[NSBundle mainBundle] pathForResource:@"AlertChordStroke" ofType:@"wav"];//打开文件AudioFileID fileID = [self openAudioFile:fileName];//获得实际音频文件大小UInt32 fileSize = [self audioFileSize:fileID];//开辟音频内存数据空间unsigned char *outData = malloc(fileSize);//读取文件到内存中OSStatus result = noErr;result = AudioFileReadBytes(fileID, false, 0, &fileSize, outData);//关闭文件AudioFileClose(fileID);//返回结果为0说明成功if (result != 0){NSLog(@"cannot load effect: %@", fileName);}//从OpenAL中获得缓冲区idalGenBuffers(1, &bufferID);//从内存中音频数据复制到缓冲区alBufferData(bufferID, AL_FORMAT_STEREO16, outData, fileSize, 44100);//清除内存中音频数据if (outData){free(outData);outData = NULL;}
}-(AudioFileID)openAudioFile:(NSString *)fileName
{AudioFileID outAFID;NSURL *afUrl = [NSURL fileURLWithPath:fileName];OSStatus result = AudioFileOpenURL((__bridge CFURLRef)afUrl, kAudioFileReadPermission, 0, &outAFID);if (result != 0){NSLog(@"cannot open file : %@", fileName);}return outAFID;
}-(UInt32)audioFileSize:(AudioFileID)fileID
{UInt64 outDataSize = 0;UInt32 thePropSize = sizeof(UInt64);OSStatus result = AudioFileGetProperty(fileID, kAudioFilePropertyAudioDataByteCount, &thePropSize, &outDataSize);if (result != 0){NSLog(@"cannot find file size");}return (UInt32)outDataSize;
}- (IBAction)switchLoop:(id)sender
{UISwitch *sw = sender;isLoop = sw.on;if (isLoop){alSourcei(sourceID, AL_LOOPING, AL_TRUE);}else{alSourcei(sourceID, AL_LOOPING, AL_FALSE);alSourceStop(sourceID);isPlaying = NO;[_btnPlay setTitle:@"播放" forState:UIControlStateNormal];}
}- (IBAction)play:(id)sender
{if (!isPlaying){alSourcePlay(sourceID);if (isLoop){isPlaying = YES;[_btnPlay setTitle:@"停止" forState:UIControlStateNormal];}}else{alSourceStop(sourceID);isPlaying = NO;[_btnPlay setTitle:@"播放" forState:UIControlStateNormal];}
}@end

iOS音频——使用OpenAL API相关推荐

  1. 关于音频播放的那点儿事儿(一) 初探iOS音频 CoreAudio Essentials

    https://www.douban.com/note/606580527/ Low-Level Services包含: 1.I/O Kit:驱动 2.AudioHAL:音频硬件抽象层,为硬件提供一个 ...

  2. 一篇对iOS音频比较完善的文章

    iOS音频播放 (一):概述 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改我也因此对于iOS下的音频播放实现有了一定的研究.写这个系列的博客目的一方面希望能够抛砖 ...

  3. iOS音频播放(一):概述

    (本文转自码农人生) 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改,我也因此对于iOS下的音频播放实现有了一定的研究.写这个 系列的博客目的一方面希望能够抛砖引玉 ...

  4. 一步一步教你实现iOS音频频谱动画(一)

    如果你想先看看最终效果再决定看不看文章 -> bilibili 示例代码下载 第二篇:一步一步教你实现iOS音频频谱动画(二) 基于篇幅考虑,本次教程分为两篇文章,本篇文章主要讲述音频播放和频谱 ...

  5. iOS 音频视频图像合成那点事

    代码地址如下: http://www.demodashi.com/demo/13420.html 人而无信不知其可 前言 很久很久没有写点什么了,只因为最近事情太多了,这几天终于闲下来了,趁此机会,记 ...

  6. iOS音频播放 (一):概述 转

    2019独角兽企业重金招聘Python工程师标准>>> 基础 先来简单了解一下一些基础的音频知识. 目前我们在计算机上进行音频播放都需要依赖于音频文件,音频文件的生成过程是将声音信息 ...

  7. 视频直播APP源码开发iOS音频播放流程

    视频直播APP源码开发iOS音频播放流程 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的, ...

  8. iOS音频采集过程中的音效实现

    1.背景 在移动直播中, 声音是主播和观众互动的重要途径之一, 为了丰富直播的内容,大家都会想要在声音上做一些文章, 在采集录音的基础上玩一些花样. 比如演唱类的直播间中, 主播伴随着背景音乐演唱. ...

  9. jquery 字符串查找_Python Appium 库IOS特有元素查找API介绍

    IOS自动化测试系列文章: 一文带你趟过mac搭建appium测试环境的遇到的坑 appium 实现简易IOS  app自动化测试demo 今天分享的是python appium库中IOS元素查找特定 ...

最新文章

  1. MPB:利用无菌植物和可培养细菌体系研究根系微生物组功能
  2. dedecms首页搜索 添加仿百度下拉框
  3. h5首页加载慢_H5网站好不好?
  4. 解决navicate 连接mysql数据库中文乱码的问题
  5. lambda expressions are not supported at this language level
  6. JavaScript称霸
  7. SQLServer 客户端远程访问配置
  8. 【机器学习】特征降维
  9. 22行代码AC_Prime Number Aizu - 0009(素数筛)(解题报告)
  10. 集齐最后一块拼图,全栈Serverless时代正式开启
  11. Vivado 2019.1 生成bit文件报错解决
  12. win8 打开计算机配置,win8.1 更改电脑配置无法使用
  13. 【Luogu1363】幻想迷宫
  14. 人工智能 企业变革_我们如何利用(人工)情报变革医院的运营管理
  15. SQL Server创建数据库
  16. 怎样知道android的手机号码,怎么知道自己的手机号
  17. 51单片机+ESP8266-01WIFI模块实现数据传输
  18. 心海软件学生测试系统,心海软件
  19. oracle 联合查询去重,oracle两张表关联查询
  20. Unity C#编程优化——枚举

热门文章

  1. Mac如何导出备份企业微信的聊天记录
  2. 李宏毅机器学习系列-强化学习之模仿学习
  3. css设置html表格边框颜色,互联网常识:CSS如何设置htmltable表格边框样式
  4. 怎么在cmd中查看环境变量
  5. 性能优化之通过Aspose组件将Word/Excel/PPT/PDF转成HTML文件,解决大附件预览性能问题
  6. 条形码扫描查询mysql数据库,用于扫描产品ID条形码并在数据库中提交deatils的PHP代码...
  7. 【已解决】Defects4J v2.0 Jsoup checkout失败
  8. 取消开机按F1的解决方法
  9. Android - Glide加载gif时图片自适应手机屏幕的宽高
  10. 爬虫爬取到空网页的解决办法和防止被封号的技巧---设置headers和proxies