SoundManager 是一个用于在 iOS 或 Mac 应用中播放声音和音乐的简单类。
注意:'支持' 意味着库已与该版本进行了测试。'兼容' 意味着库应在本 iOS 版本上运行(即它不依赖于任何不可用的 SDK 功能),但不再进行兼容性测试,可能需要调整或错误修复才能正确运行。
从版本 1.4 开始,SoundManager 需要 ARC。如果您想在非 ARC 项中使用 SoundManager,只需将 -fobjc-arc 编译器标志添加到 SoundManager.m 类中即可。为此,请转到目标设置中的构建阶段选项卡,打开编译源代码组,双击列表中的 iRate.m,在弹出窗口中键入 -fobjc-arc。
如果您想将整个项目转换为 ARC,请注释掉 SoundManager.m 中的 #error 行,然后运行 Xcode 中的编辑 > 重构 > 转换到 Objective-C ARC... 工具,并确保要使用 ARC 的所有文件都已勾选(包括 SoundManager.m)。
要在应用中使用 SoundManager 类,只需将类文件拖到项目中。对于 iOS 应用,或部署目标为 10.7(狮子)或更高的 Mac OS 应用,您还需要添加 AVFoundation 框架。
SoundManager 包定义了两个类,下面的 SoundManager 类本身,以及用于围绕正在播放的每个声音文件包装的 Sound 类。Sound 类可以使用 SoundManager 类直接或间接使用。
@property (nonatomic, readonly, copy) NSString *name;
声音的名称。这既可以是传递给 soundNamed:
构造方法的名字,也可以是声音文件的最后一个路径组件。
@property (nonatomic, readonly, strong) NSURL *URL;
声音文件的绝对 URL。
@property (nonatomic, readonly) NSTimeInterval duration;
声音文件的持续时间(以秒为单位)。
@property (nonatomic, assign) NSTimeInterval currentTime;
当前音频文件的时间偏移量(以秒为单位)。此值可读写,因此您可以将它设置为零以倒回音频。
@property (nonatomic, readonly, getter = isPlaying) BOOL playing;
如果音频正在播放返回YES,如果没有播放返回NO(只读)。
@property (nonatomic, assign, getter = isLooping) BOOL looping;
如果音频设置为循环返回YES,如果没有设置为循环返回NO。
@property (nonatomic, copy) SoundCompletionHandler completionHandler;
一个回调块,当音频播放完成或停止时将被调用。在任何给定的Sound实例上,只能设置一个completionHandler块,但如果需要多个对象跟踪音频的状态,则可以通过添加对SoundDidFinishPlayingNotification
通知的观察者来实现。
@property (nonatomic, assign) float baseVolume;
音频的最大音量。有些声音比其他声音响亮,尝试在代码中逐个管理应用中不同声音的音量可能会很烦人。baseVolume 属性允许您在创建时均衡不同声音的音量,然后您可以从那个点开始一致地调整它们的音量。
@property (nonatomic, assign) float volume;
音频的音量。这是通过baseVolume属性乘以以获得实际音量。默认值为1.0(最大)。
@property (nonatomic, assign) float pan;
文件左右立体声平衡。值范围从-1.0到1.0,可用于在空间中改变声音的位置。在Mac OS 10.6上没有效果。
+ (Sound *)soundNamed:(NSString *)name;
这是一个方便的简写构造器方法,它基于应用包中文件的名字来返回一个音频对象。如果省略文件扩展名,则假定是.caf文件。如果您为此方法传递一个完全合格的路径,则它 behaves 与 soundWithContentsOfFile:
相同。
+ (Sound *)soundWithContentsOfFile:(NSString *)path;
- (Sound *)initWithContentsOfFile:(NSString *)path;
+ (Sound *)soundWithContentsOfURL:(NSURL *)URL;
- (Sound *)initWithContentsOfURL:(NSURL *)URL;
这些方法从文件路径或URL创建一个新的Sound实例。
- (void)fadeTo:(float)volume duration:(NSTimeInterval)duration;
此方法从当前音量淡入到指定音量,持续指定的时间。请注意,此方法不会播放声音,因此您需要在调用此方法之前调用play
,除非声音正在播放。
- (void)fadeIn:(NSTimeInterval)duration;
在指定的持续时间将音量从0.0淡出到1.0。如果音量已经为零,则音量将设置为零。有关未播放的声音的注意事项,请参阅上面的免责声明。
- (void)fadeOut:(NSTimeInterval)duration;
从当前音量淡出到0.0,持续指定的时间。当音量达到零时,将自动调用声音的停止方法。
- (void)play;
播放声音。如果声音已经在播放,则没有效果。
- (void)stop;
停止声音。如果没有播放,则没有效果。停止声音不会重置currentTime,因此播放已停止的声音将从中断点继续播放。
@property (nonatomic, readonly, getter = isPlayingMusic) BOOL playingMusic;
这是一个只读属性,报告SoundManager当前是否正在播放音乐。
@property (nonatomic, assign) BOOL allowsBackgroundMusic;
此属性用于控制iPhone上的音频会话,以允许在后台播放iPod音乐。它默认为NO,因此在进行任何声音或音乐播放之前,如果不想中断iPod音乐,则应将其设置为YES。目前在Mac OS上没有效果。
@property (nonatomic, assign) float soundVolume;
设置音量。影响所有当前播放的声音以及随后播放的声音。应在此范围内0 - 1。
@property (nonatomic, assign) float musicVolume;
设置音乐音量。影响当前播放的音乐曲目以及随后播放的音乐曲目。应在此范围内0 - 1。
@property (nonatomic, assign) NSTimeInterval musicFadeDuration;
音乐曲目淡入/淡出和交叉淡入淡出的持续时间(默认为1秒)。
@property (nonatomic, assign) NSTimeInterval soundFadeDuration;
调用stopSound时声音的淡出时间(默认为1秒)。
+ (SoundManager *)sharedManager;
这个类方法返回SoundManager共享单例实例。
- (void)prepareToPlay;
prepareToPlay
方法预加载您应用程序包中的一个随机声音,这初始化了音频播放。它应该在您尝试播放任何音频之前调用,理想情况下在启动过程中,以消除首次播放声音或音乐曲目时的延迟。注意: 这只会在您的应用程序包根目录中至少包含一个声音文件时生效。如果所有声音文件都包含在文件夹中,请考虑添加一个额外的短而无声的声音文件以便初始化,或者使用 prepareToPlayWithSound:
方法。
- (void)prepareToPlayWithSound:(id)soundOrName;
如果声音不在应用程序包的根目录中(甚至在包中),则标准 prepareToPlay
方法将不起作用。在这种情况下,您可以使用 prepareToPlayWithSound:
方法并指定用于初始化的特定声音。参数可以是文件名、路径(相对于或绝对)或 Sound 类的实例。
- (void)playSound:(id)soundOrName looping:(BOOL)looping fadeIn:(BOOL)fadeIn;
- (void)playSound:(id)soundOrName looping:(BOOL)looping;
- (void)playSound:(id)soundOrName;
播放方法将播放一个声音。参数可以是一个之前创建的 Sound 实例,或者一个要加载的声音文件的名称或路径。您可以在名称中包含文件扩展名,或者省略它,在这种情况下,SoundManager 将查找具有 .caf 文件扩展名的匹配文件。如果循环参数为 YES,则声音将继续播放,直到调用 stopSound: 为止。如果 fadeIn 参数为 YES,则声音将以 SoundManager 类的 soundFadeDuration
属性指定的时间从 0 到全音量渐入。如果省略,则循环和渐入都默认为 NO。
- (void)stopSound:(id)soundOrName fadeOut:(BOOL)fadeOut;
- (void)stopSound:(id)soundOrName;
此方法将立即停止声音,或根据 fadeOut 参数(默认为 YES)以 soundFadeDuration
指定的时间内渐出。声音或名称参数可以是一个之前创建的 Sound 实例,或一个名称或路径。如果有多个声音实例正在播放,则它们都将被停止。
- (void)stopAllSounds:(BOOL)fadeOut;
- (void)stopAllSounds;
此方法将停止和/或淡出所有正在播放的声音,但不会停止音乐。这相当于为正在播放的每个声音调用 stopSound
。
- (void)playMusic:(id)soundOrName looping:(BOOL)looping fadeIn:(BOOL)fadeIn;
- (void)playMusic:(id)soundOrName looping:(BOOL)looping;
- (void)playMusic:(id)soundOrName;
此方法播放音乐曲目。如果 fadeIn 参数为 YES,音乐将以 musicVolume 属性指定的音量从静音渐入,渐入时间为 musicFadeDuration
指定的时间(如果省略,则默认为 YES)。声音管理器一次只允许播放一个音乐曲目,因此如果正在播放一个现有曲目,它将被渐出。如果循环参数为 YES,音乐将继续播放,直到调用 stopMusic
(如果省略,则默认为 YES)。
- (void)stopMusic:(BOOL)fadeOut;
- (void)stopMusic;
这将停止和/或以 musicFadeDuration
指定的时间内淡出现有播放的音乐曲目。
SoundDidFinishPlayingNotification
每当声音播放结束(由于自然结束或调用停止方法)时,都会触发此通知(通过 NSNotificationCenter)。通知对象是 Sound 类的一个实例,SoundManager 使用它来内部播放声音和音乐文件。您可以通过访问 Sound 类的 name
属性来找出哪个声音已结束。
iPhone 对播放哪些声音非常挑剔。为了获得最佳效果,请使用 .caf 文件,您可以使用 afconvert 命令行工具生成 。以下是一些常见的配置
用于背景音乐(单声道)
/usr/bin/afconvert -f caff -d aac -c 1 {input_file_name} {output_file_name}.caf
用于背景音乐(立体声)
/usr/bin/afconvert -f caff -d aac {input_file_name} {output_file_name}.caf
用于声音效果(单声道)
/usr/bin/afconvert -f caff -d ima4 -c 1 {input_file_name} {output_file_name}.caf
用于声音效果(立体声)
/usr/bin/afconvert -f caff -d ima4 {input_file_name} {output_file_name}.caf
版本 1.4.2
版本 1.4.1
版本 1.4
版本 1.3.1
版本 1.3
版本 1.2.1
版本 1.2
版本 1.1.3
FILE_EXTENSION
重命名为 DEFAULT_FILE_EXTENSION
以避免混淆。版本 1.1.2
版本 1.1.1
版本 1.1
版本 1.0