【发布时间】:2011-08-26 17:38:46
【问题描述】:
我正在使用 Xcode 为 Mac OS X 制作一个应用程序,我希望它在发生某些事情时播放警报声。
在 Objective-C/Cocoa 中播放声音的最简单代码是什么?请注意,我的声音文件是.aif。
另外,我应该将声音文件放在我的项目中的什么位置?
谢谢。
【问题讨论】:
标签: objective-c cocoa macos audio
我正在使用 Xcode 为 Mac OS X 制作一个应用程序,我希望它在发生某些事情时播放警报声。
在 Objective-C/Cocoa 中播放声音的最简单代码是什么?请注意,我的声音文件是.aif。
另外,我应该将声音文件放在我的项目中的什么位置?
谢谢。
【问题讨论】:
标签: objective-c cocoa macos audio
要在 Mac 上播放音频,您可以将NSSound 用于基本活动,或者使用更强大的CoreAudio 框架来处理更复杂的任务。
如果您要使用NSSound 来实现此目标,您的代码将如下所示:
NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"replace-with-file-name" ofType:@"aif"];
NSSound *sound = [[NSSound alloc] initWithContentsOfFile:resourcePath byReference:YES];
// Do something with sound, like [sound play] and release.
或
NSSound *sound = [NSSound soundNamed:@"replace-with-file-name-without-the-extension"];
// Do something with sound, like [sound play], but don't release (it's autoreleased).
如果您要使用第二个 sn-p,则必须确保声音文件的扩展名是 aiff 而不仅仅是 aif,因为 +soundNamed: 会查找非常特定的文件扩展名;我认为aif 不在该列表中。
使用CoreAudio比较复杂,所以如果你只是想玩它并搞乱非常简单的设置,只需使用NSSound
【讨论】:
声音的基本播放非常简单。
您可以使用NSSound 类以几种不同的方式加载文件,例如,按名称:
NSSound * myAwesomeSound = [NSSound soundNamed:@"AwesomeSound"];
如果您想保留它,则需要保留它。
在这种情况下,该类将在某些特定目录(包括您的应用程序包)中搜索具有该名称的声音文件。一个重要的注意事项是该文件必须具有.aiff(带有两个 f's)扩展名才能被此方法找到。*
您可能会将声音文件存储在项目的 Resources 文件夹中;这就是通常保存“媒体”文件的地方。
然后你可以很简单地播放它,也许使用按钮按下:
- (IBAction)playTheSound:(id)sender {
NSSound * myAwesomeSound = [NSSound soundNamed:@"AwesomeSound"];
[myAwesomeSound play];
}
还可以进行一些基本的传输控制:暂停、停止、检查声音是否结束,等等。详情请见Sound Programming Topics Guide。
*当然也可以使用其他格式。
【讨论】:
例如,添加 AudioToolbox 框架,将声音文件添加到您的资源/项目中,然后将以下内容添加到您的 .h:
#import <AudioToolbox/AudioToolbox.h>
然后:(在您的 .h 中的 @interface { blah } 之后)
- (IBAction) playSound;
将以下内容添加到您的 .m 中:(将“Ping”和“wav”更改为各自的文件名和类型)
- (IBAction) playSound
{
SystemSoundID soundID;
NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"Ping" ofType:@"wav"];
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:soundFile], &soundID);
AudioServicesPlaySystemSound(soundID);
[soundFile release];
}
【讨论】: