我正在研究制作一些使键盘功能像钢琴的软件(例如,用户按下'W'键,扬声器播放D音符).我可能会使用OpenAL.我理解数字音频的基础知识,但是在按键时播放实时音频会带来一些问题我无法解决.
问题在于:假设我有10个音频缓冲区,每个缓冲区都有一秒钟的音频数据.如果我必须在通过扬声器播放之前填充缓冲区,那么我会在播放前一两秒填充缓冲区.这意味着每当用户尝试播放音符时,按下琴键和正在播放的音符之间将有一到两秒的延迟.
你是如何解决这个问题的?你是否只是让缓冲区尽可能小,并尽可能地填充它们?有一些我不知道的伎俩吗?
我正在为iPhone制作一个opengl游戏.我即将开始为应用添加声音效果.我想知道为此目的最好的框架是什么.
AV基础是我最好的选择吗?我还缺少任何其他人,比如Open AL?
过去两周我一直在这里,这让我发疯.几天前我问过这个问题(提取iPod库原始PCM样本并播放声音效果),虽然答案让我走了一半,但我仍然卡住了.
基本上我想要实现的是从iPod库中加载多首歌曲,以便通过弯音,均衡效果等效果进行播放......
我走了AVPlayer和AVAudioPlayer的路线太简单了.我见过的唯一可以用这些效果播放音频的框架是OpenAL.我尝试了一些客观的c包装器(Finch和ObjectAL)Finch不播放压缩音频,而ObjectAL只会为我转换它,如果我传入一个文件的URL(这是我不能做的,因为我只有一个不兼容的iPod库URL).
一个应用程序的一个例子,我想要美丽的东西是Tap DJ.它可以快速加载来自iPod库的歌曲(与TouchDJ不同,它可以播放各种各样的效果.
任何帮助将非常感激.
我正在做一个涉及以多轨道格式播放歌曲的应用程序(鼓,人声,吉他,钢琴等......).我不需要对每个音轨进行任何精美的音频处理,我需要做的就是播放,暂停和静音/取消静音.
我一直在使用AVAudioPlayer的多个实例,但在进行设备测试时,我注意到首次播放时曲目的播放效果非常不同步.此外,当我暂停并播放曲目时,它们会继续变得更加不同步.经过一番研究后,我意识到AVAudioplayer只有太多的延迟,不能用于我的应用程序.
在我的应用程序中,我基本上有一个AVAudioPlayers的NSArray,我会循环播放每个或暂停/停止每个,我敢肯定这是导致它在设备上失去同步的原因.
看起来Apple的音频混音器对我来说效果很好,但是当我尝试实现它时,我得到一个我无法弄清楚的EXC_BAD_ACCESS错误.
我知道答案是使用OpenAL或音频单元,但是当我需要做的就是同时播放5个.mp3音轨时,似乎没有必要花几个星期来学习这些.有没有人对如何做到这一点有任何建议?谢谢
我无法编译以下代码
#include <AL/al.h>
#include <AL/alc.h>
#include <iostream>
int checkEnumerationSupport() {
ALboolean enumeration;
enumeration = alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT");
if (enumeration == AL_FALSE) {
// enumeration not supported
std::cout << "enumerating devices NOT supported\n";
} else {
// enumeration supported
std::cout << "enumerating devices supported\n";
};
return 0;
}
int main() {
checkEnumerationSupport();
}
Run Code Online (Sandbox Code Playgroud)
使用以下命令.
g++ test.cpp -o test
Run Code Online (Sandbox Code Playgroud)
我收到以下消息:
/tmp/ccEN7YAp.o: In function `checkEnumerationSupport()':
test.cpp:(.text+0x13): undefined reference to `alcIsExtensionPresent'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
实现库没有正确链接,我尝试将g ++行更改为
g++ -L/usr/lib/ test.cpp -o test …Run Code Online (Sandbox Code Playgroud) 想象一下这个功能:
void SoundManager::playSource(ALuint sourceID, float offset)
{
alSourceStop(sourceID);
ALint iTotal = 0;
ALint iCurrent = 0;
ALint uiBuffer = 0;
alGetSourcei(sourceID, AL_BUFFER, &uiBuffer);
alGetBufferi(uiBuffer, AL_SIZE, &iTotal);
iCurrent = iTotal * offset;
alSourcei(sourceID, AL_BYTE_OFFSET, iCurrent);
alSourcePlay(sourceID);
}
Run Code Online (Sandbox Code Playgroud)
想法是调用playSource(x, 0.5f)将跳转到(大致)缓冲区的中途等.
它在我第一次调用时工作正常,但是如果我在同一个源上再次调用它(无论该源是否正在播放),它就会开始播放,好像我用偏移0调用它一样.
有什么想法吗?
我有一个声音管理器类,它实现了AVAudioSessionDelegate协议,即beginInterruption和endInterruption方法.
但是,当我给手机打电话并回到应用程序时,这两种方法都没有被调用,应用程序此后也是静音.这是使用调试器和使用NSLog调用进行测试的.
声音管理器类使用openAL.
-
我的类声明如下:
@interface CMOpenALSoundManager : NSObject <AVAudioPlayerDelegate, AVAudioSessionDelegate>
Run Code Online (Sandbox Code Playgroud)
并且委托实现如下:
- (void)beginInterruption {
[self setActivated:NO];
}
- (void)audioPlayerBeginInterruption {
[self setActivated:NO];
}
- (void)endInterruption {
[self setActivated:YES];
}
- (void)audioPlayerEndInterruption {
[self setActivated:YES];
}
Run Code Online (Sandbox Code Playgroud)
其中setActivated:(BOOL)状态包含启动和停止声音管理器的代码.
-
我看不出任何不能调用委托方法的原因 - 也许在我启动声音管理器或设置音频属性等时我忘了做什么?
或者我公然错过了一些更明显的东西:o
任何想法都非常感谢!
作为大学项目的一部分,我必须做一些信号处理,并希望使用PC声卡输出结果.该软件必须用C语言编写,并且需要与Windows一起使用(最好是7和XP).
我找到了输出.wav和类似文件的代码示例,但我感兴趣的是不断输出数据而不是从文件输出.虽然一些声音API似乎有自己的处理缓冲区的方法,但输出数据可能会以数组形式呈现.
任何建议都会很棒,代码示例甚至是最好的API也是如此.我看过DirectSound和OpenAL,但我仍然不确定如何开始.
我在XCode中创建了一个项目并添加了OpenAL框架.当我尝试包含它时,编译器仍然无法找到AL/al.h.
我在哪里添加OpenAL的include目录?
编辑:对不起,我忘了添加:我正在使用C/C++
我正在从FMOD迁移到OpenAL,我找不到FSOUND_Sample_GetLength()函数的模拟,它返回样本中的样本长度(它不考虑频率)...我得到OpenAL缓冲区名称来自alutLoadMemoryFromFileImage(),所以我无法以这种方式得到波形数据.
请帮忙!
openal ×10
audio ×5
c++ ×3
iphone ×3
objective-c ×3
core-audio ×2
audiounit ×1
c ×1
directsound ×1
fmod ×1
g++ ×1
ios ×1
ipod ×1
latency ×1
linux ×1
offset ×1
real-time ×1
synthesizer ×1
windows ×1
xcode ×1