我的需求是:我有大约10个带有小滴声、哔哔声和按钮按下声音的CAF文件。没有什么特别的。现在我想在每次发生某些事情时播放这些文件。同时可能会发生几件事情。因此,可能会出现播放重叠的情况。
也许有一个框架可以用来实现这个功能吗?
播放小的提示音、蜂鸣声等(少于30秒的声音)实际上非常容易 - 这正是AudioServices的用途。您需要首先获取每个声音的ID,可以使用以下方法:
SystemSoundID soundID = 0;
CFURLRef soundFileURL = (CFURLRef)[NSURL URLWithString:somePathString];
OSStatus errorCode = AudioServicesCreateSystemSoundID(soundFileURL, &soundID);
if (errorCode != 0) {
// Handle failure here
}
您可以保存该ID,直到需要使用它时,只需使用以下代码行即可播放声音:
AudioServicesPlaySystemSound(soundID);
还有一个AudioServicesPlayAlertSound()
函数,它的行为会根据设备的能力略有不同,例如如果用户已将 iPhone 配置为振动,则会振动。您应该阅读Apple文档中的说明以获得更完整的解释。
请注意,使用 AudioServices 播放声音时,您对其播放几乎没有控制权 - 无法停止、控制音量等。AudioServices 只适用于警报声和其他短暂的哔哔声。当然,有 AVAudioPlayer,但在这种情况下,它有点过重了。除非 AudioServices 的某个限制使其无法使用,否则最好坚持使用 AudioServices。
您需要链接 AudioToolbox.framework 才能使用这些函数。
P.S. 欢迎来到 Stack Overflow!别忘了阅读 FAQ 并为你的问题标记接受的答案(如果它们是值得接受的好答案)。
我只使用iPhone工作了几周,从这个论坛上得到了很多帮助,所以能够回答问题让我感到非常高兴。
你需要的小工具是AVAudioPlayer,在苹果文档中可以找到。我刚刚完成了一个小的录音/播放应用程序,主要使用了书籍《IPhone SDK Development》(Dudney和Adamson)第16章的大量帮助。
在我投资的四本iPhone编程书籍中,它拥有最现实的应用程序可供使用。
但无论如何,请查看AVAudioPlayer类参考。它非常容易使用,这是一个新手的评价。
John Doner
以下代码适用于我播放 .caf 文件
SystemSoundID SoundID;
NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"beep" ofType:@"caf"];
NSURL *soundURL = [NSURL fileURLWithPath:soundPath];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL, &SoundID);
AudioServicesPlaySystemSound(SoundID);