我正在尝试创建一个面向对象的模型来包装OpenAL,并且在理解设备,缓冲区和上下文时遇到一些问题.
从我在程序员指南中可以看到,有多个设备,每个设备可以有多个上下文以及多个缓冲区.每个上下文都有一个监听器,alListener*()所有函数都在活动上下文的监听器上运行.(这意味着如果我想改变它的倾听者,我必须首先激活另一个上下文,如果我做对了.)到目前为止,那么好.令我恼火的是,我需要将设备传递给alcCreateContext()函数,但没有alGenBuffers().
这怎么工作呢?当我打开多个设备时,在哪个设备上创建了缓冲区?缓冲区是否在所有设备之间共享?如果我关闭所有打开的设备,缓冲区会发生什么?
(或者我错过了什么?)
所以我想知道什么是最短的(在有效线路方面)打开AL代码从默认麦克风读取数据并输出到默认扬声器?
我正在Visual Studio 2008下的Windows 7上进行开发
有没有办法在iOS上使用OpenAL进行混响?任何人都有任何代码片段来实现这种效果?我知道它不包含在iOS的OpenAL库中,但我认为还有一种方法可以对它进行编程.
谢谢.
我需要工具来学习如何在Mac OS X应用程序中使用OpenAL.我做了大量的iOS和Mac开发,通常很擅长快速学习新东西.任何人都可以提供一个或两个有一些教程的网站吗?
我有一个问题,我以为我会问这里.
我在两个应用程序中实现了OpenAL.
问题是如果一个应用程序在后台运行(即我启动它,然后按下HOME按钮启动另一个) - 当我启动另一个应用程序alcOpenDevice失败时.它返回:
2013-12-04 11:39:23.866 Safari Puzzle [4132:4803] 11:39:23.866错误:185:创建聚合音频设备时出错:'nope'
2013-12-04 11:39:23.867 Safari Puzzle [4132:4803] 11:39:23.867警告:219:输入设备为0x39; 'AppleHDAEngineInput:1B,0,1,0:1'
2013-12-04 11:39:23.867 Safari Puzzle [4132:4803] 11:39:23.867警告:223:输出设备为0x2f; 'AppleHDAEngineOutput:1B,0,1,1:0'
2013-12-04 11:39:23.868 Safari Puzzle [4132:4803] 11:39:23.868错误:398:错误'nope'
2013-12-04 11:39:23.869 Safari Puzzle [4132:4503] 11:39:23.869错误:398:错误-66680
2013-12-04 11:39:23.869 Safari Puzzle [4132:70b] 11:39:23.869错误:> aurioc> 783:失败:-10851(启用2,outf <2 ch,44100 Hz,Int16,inter> inf <2 ch,0 Hz,Int16,inter>)
有人帮忙吗?
编辑:
可能只是模拟器 - 在真实设备上两个应用程序都可以正常工作......
问题陈述:
我在我的应用程序中收集了一些声音效果,存储为.m4a文件(AAC格式,48 KHz,16位),我想以各种速度和音高播放,而不必将所有变体预先生成为单独的文件.
虽然对象的.rate属性AVAudioPlayer可以改变播放速度,但它始终保持原始音高,这不是我想要的.相反,我只是想要更快或更慢地播放声音样本并让音调上下移动以匹配 - 就像加速或减慢老式卷轴到磁带录音机一样.换句话说,我需要一些方法来基本上改变音频采样率,如+2半音(快12%),-5半音(慢33%),+ 12半音(快2倍)等.
题:
是否有某种方法从AVAudioPlayer对象中获取线性PCM音频数据,使用不同的iOS框架应用采样率转换,并将生成的音频数据填充到新AVAudioPlayer对象中,然后可以正常播放?
可能的途径:
我正在读书AudioConverterConvertComplexBuffer.特别是kAudioConverterSampleRateConverterComplexity_Mastering,并且kAudioConverterQuality_Max,AudioConverterFillComplexBuffer()引起了我的注意.所以这个音频转换框架看起来很可能.这是一条我应该进一步探讨的途径吗?
要求:
我实际上不需要立即开始播放.如果采样率转换引起轻微延迟,那很好.我所有的样本都是4秒或更短的时间,所以我认为任何即时重新采样都会很快发生,大约为1/10秒或更短.(不过,超过1/2会是太多了.)
如果有一种更简单的方法可以使用iOS提供的转换框架,我真的不想进入像OpenAL或Core Audio这样的重量级东西.但是,如果使用OpenAL或Core Audio 有一个简单的解决方案,我很乐意考虑这一点."简单"是指可以在50-100行代码中实现的东西,并且不需要启动额外的线程来将数据提供给声音设备.我宁愿把所有事情都自动解决 - 这就是为什么我愿意在播放前转换音频片段.
我想在这里避免使用任何第三方库,因为这不是火箭科学,我知道必须以某种方式使用原生iOS框架.
同样,我需要一起调整音高和播放速率,而不是单独调整.因此,如果播放速度减慢了2倍,那么人声会变得非常深沉且说话速度慢.如果播放速度加快2-3倍,那么人类的声音听起来就像一个快速说话的花栗鼠.换句话说,我绝对不希望在保持音频持续时间相同的同时改变音调,因为当向上弯曲音调超过一对半音时,该操作导致不期望的"细小"声音.我只是想加快整个过程,让音调上升为一种自然的副作用,就像过去的老式录音机一样.
需要在iOS 6及更高版本中工作,尽管iOS 5支持将是一个不错的奖励.
我想用OpenAL在iOS游戏中播放音乐.音乐文件以mp3格式存储,我想使用缓冲队列来传输它们.我使用AudioFileReadPacketData()将音频数据加载到缓冲区中.但是播放缓冲区只会给我带来噪音.它适用于caf文件,但不适用于mp3.我是否错过了解码文件的一些重要步骤?
代码我用来打开声音文件:
- (void) openFile:(NSString*)fileName {
NSBundle *bundle = [NSBundle mainBundle];
CFURLRef url = (CFURLRef)[[NSURL fileURLWithPath:[bundle pathForResource:fileName ofType:@"mp3"]] retain];
AudioFileOpenURL(url, kAudioFileReadPermission, 0, &audioFile);
AudioStreamBasicDescription theFormat;
UInt32 formatSize = sizeof(theFormat);
AudioFileGetProperty(audioFile, kAudioFilePropertyDataFormat, &formatSize, &theFormat);
freq = (ALsizei)theFormat.mSampleRate;
CFRelease(url);
}
Run Code Online (Sandbox Code Playgroud)
我用来填充缓冲区的代码:
- (void) loadOneChunkIntoBuffer:(ALuint)buffer {
char data[STREAM_BUFFER_SIZE];
UInt32 loadSize = STREAM_BUFFER_SIZE;
AudioStreamPacketDescription packetDesc[STREAM_PACKETS];
UInt32 numPackets = STREAM_PACKETS;
AudioFileReadPacketData(audioFile, NO, &loadSize, packetDesc, packetsLoaded, &numPackets, data);
alBufferData(buffer, AL_FORMAT_STEREO16, data, loadSize, freq);
packetsLoaded += numPackets;
}
Run Code Online (Sandbox Code Playgroud) 我想控制声源音量如何逐渐淡出的方式,我该怎么做?
编辑:我也想知道如何相应地缩放声音坐标系:我不想听到远离声源的声音:现在我将不得不改变我的渲染代码以缩放坐标以使其按我想要的方式工作.
编辑2:虽然,一个解决方案可能是在我发送它们之前乘以我的坐标......但是有更优雅的方法吗?
OpenAL利用HRTF算法用立体声耳机伪造环绕声.然而,HRTF与用户头部和耳朵的形状之间存在重要的依赖关系.
简化,这意味着:如果您的头部/耳朵与他们实施的标准HRTF功能相差太大,环绕声效果会逐渐消失.
我还没有找到一种方法来调整导致HRTF算法的各种因素,例如头部直径,耳廓/外耳尺寸,耳朵到耳朵距离,鼻子长度和影响HRTF的其他重要特性.
是否有任何已知的方法来设置这些参数以获得最佳环绕声体验?
是否有一个很好的方法可以在Java中获得体面,可靠的数字采样声音播放?
我的请求列表非常简短:
拥有以下内容会很高兴,但实际上我可以没有它:
我已经尝试了臭名昭着的Java Sound API,但发现它完全不可靠,似乎无法满足我的最小愿望清单.我得到的问题:
在使用ALSA dmix(OpenJDK 6)的Linux上,在初始化Java Sound API时让任何其他应用程序使用音频只会使Java应用程序中的所有声音消失而不会出现任何错误/警告.
在Linux(OpenJDK 6)上,列出MixerInfos并尝试Clip使用其中任何一个获取对象时,在尝试加载wav文件时会引发以下异常:
java.lang.IllegalArgumentException: Line unsupported: interface Clip supporting format PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
Run Code Online (Sandbox Code Playgroud)
因此,AudioSystem.getClip(anySortOfMixer)似乎根本不起作用.只有AudioSystem.getClip()作品.
使用不同的采样率/位/格式加载文件Clip失败LineUnavailableException.似乎第一次调用clip.open将声音系统设置为特定声音选项,在调用后加载具有略微不同采样率的文件(例如,第一个是44100,第二个是48000)
在Linux(OpenJDK 6)上初始化几个不同的Clips并尝试播放它们只会使最后加载Clip声音 - 没有给出错误/警告,但只有play在最后Clip加载时才使用任何声音 - 所有其他声音都是静音的:
Clip loadSound(String name) {
URL url = this.getClass().getResource("/" + name + ".wav");
Clip …Run Code Online (Sandbox Code Playgroud)