我想用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) 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)我在iPhone上使用OpenAL同时播放多个音频样本.
我可以让OpenAL在单个样本播放时通知我吗?
我想避免硬编码样本长度和设置计时器.
我的iPhone应用程序上有一个OpenAl声音引擎.当我播放我加载的声音时,我可以控制它的音高.
在OpenAl中,设置为1.0的音高无效.如果你把它加倍到2.0,它会弹奏1个八度的音符(12个半音).如果你把它减半,到0.5,它将是一个八度音程(12个半音).
所以,我原来的样品被打C.我认为,如果我把1×12(个半音)我可以得到在八度音程的各个音符的音高.但事实似乎并非如此.这让我们认为半音不是平等的价值观.真的吗?
有谁知道如何计算八度音中单个音符的openAl音高值?
谢谢
在使用OpenAL库时,是否可以使用iPhone的mp3和AAC的硬件加速解码?
我想如果可能的话,有两种可能的方法.
iPhone特定的OpenAL扩展.
iPhone API将音频解码为原始字节.
我有两个具体的用例.
男孩!没人能得到答案吗?Apple的NDA是否会纠结这些问题?这是怎么回事?当然,使用OpenAL的其他人希望获得更好的音频性能.
我们的ipad应用程序并行播放一堆OpenAL源,每个持续触摸一个.源是在touchesMoved上创建和启动的,并在touchesEnded或touchesCancelled上停止.
事情似乎工作正常,除了一个错误,有时一个来源似乎在触摸结束后继续播放.这似乎只在生成大量触摸事件时才会发生.
我已经验证,当发生这种情况时,我的所有AL源都已使用alSourceStop停止并且已被alDeleteSources销毁.OpenAL没有报告任何错误.但声音并没有停止.
我开始认为这可能是OpenAL的iOS实现中的一个错误.有没有人见过这样的东西?
我正在使用openAL为我的游戏播放声音,我遇到了一些问题,有时在循环播放时会出现小故障.也没有循环我得到一个小流行...有时但不是全部.
我认为这与缓冲区有点太长有关,所以最后会有一些未定义的数据.我只是无法弄清楚如何改变这一点.我正在使用此功能加载一个caf文件:
void* MyGetOpenALAudioData(CFURLRef inFileURL, ALsizei *outDataSize, ALenum *outDataFormat, ALsizei *outSampleRate, ALdouble *duration) {
OSStatus err = noErr;
SInt64 theFileLengthInFrames = 0;
AudioStreamBasicDescription theFileFormat;
UInt32 thePropertySize = sizeof(theFileFormat);
ExtAudioFileRef extRef = NULL;
void* theData = NULL;
AudioStreamBasicDescription theOutputFormat;
// Open a file with ExtAudioFileOpen()
err = ExtAudioFileOpenURL(inFileURL, &extRef);
if(err) { printf("MyGetOpenALAudioData: ExtAudioFileOpenURL FAILED, Error = %ld\n", err); goto Exit; }
// Get the audio data format
err = ExtAudioFileGetProperty(extRef, kExtAudioFileProperty_FileDataFormat, &thePropertySize, &theFileFormat);
if(err) { printf("MyGetOpenALAudioData: ExtAudioFileGetProperty(kExtAudioFileProperty_FileDataFormat) FAILED, Error = %ld\n", …Run Code Online (Sandbox Code Playgroud) 简而言之: 如何在iOS中进行时间拉伸和音高转换?
详细地:
我想做什么?
该应用程序将显示的视频缩略图的用户选择一定范围内的帧从视频文件.
我要申请的坡道缓莫,仅在选定的持续时间或帧的视频.
Ramp Slow Mo:动态地延长(时间拉伸+音高变化).我必须在一个for循环中改变时间和音高,比如10次迭代.它只不过是英文字母"U"的行为.所以,我会增加时间和音调并减少它们.
我怎么尝试:
分析:
到目前为止,我发现OpenAl或Audio Units(单独使用AUVarispeed或者同时使用AUTimePitch和Time Rate)可以提供帮助.分割视频和音频后,我将使用OpenAL或Audio Units继续进行音频URL.
我的问题: …
我试图根据本教程(http://wiki.lwjgl.org/index.php?title=OpenAL_Tutorial_1_-_Single_Static_Source)在LWJGL 3中加载声音,但是我发现了类WaveData的问题,这很可能是LWJGL 2.X的旧版本不存在.因为我甚至无法编译代码.有没有其他方法如何使用openAL加载lwjgl中的声音...
在LWJGL 2我曾经使用paulscode音响系统(http://www.paulscode.com/forum/index.php?topic=4.0),但我不确定它现在是否适用于较新版本的LWJGL 3.谢谢为你的答案:)
如果在lwjgl3中有关于声音的任何教程,你能不能在你的答案中包含链接,我尝试谷歌搜索theese教程多年但我失败了.