本篇文章跟大家简单地介绍下iOS音频的播放,即AVFoundation框架的使用。这里以音效播放为例,实现的功能是点击屏幕,随机播放一个音效。
为了使代码简洁,这里封装了一个音频工具类-STAudioTool来播放音频,在控制器中只需要调用该类的方法即可。
首先,导入AVFoundation框架,并导入其头文件#import <AVFoundation/AVFoundation.h>。在STAudioTool类中定义了一个字典的全局变量,用于存放所有的音频ID,一个音效文件会对应一个soundID。
在STAudioTool的头文件中有两个类方法,一个用来播放音效,一个用来销毁音效:
#import <Foundation/Foundation.h>
@interface STAudioTool : NSObject
/**
播放音效
*/
+(void)playSound:(NSString *)fileName;
/**
销毁音效
*/
+(void)disposeSound:(NSString *)fileName;
@end
对于存放音频ID的字典我们不需要重复创建,因此把它放在了initialize中初始化,只需要初始化一次即可。下面来看看播放/销毁音效两个方法的实现:+(void)playSound:(NSString *)fileName
{
if (!fileName) return;//如果文件为空,则直接返回
//1.从字典中取出soundID
SystemSoundID soundID=[_soundIDDict[fileName] unsignedIntValue];
if (!soundID) {//创建
//加载音效文件
NSURL *url=[[NSBundle mainBundle]URLForResource:fileName withExtension:nil];
if (!url) return;//如果url为空,则直接返回
//创建音效ID
AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)url, &soundID);
//放入字典
_soundIDDict[fileName]=@(soundID);
}
//2.播放
AudioServicesPlaySystemSound(soundID);
}
+(void)disposeSound:(NSString *)fileName
{
if (!fileName) return;
SystemSoundID soundID=[_soundIDDict[fileName] unsignedIntValue];
if (!soundID) {
//销毁音效ID
AudioServicesDisposeSystemSoundID(soundID);
//从字典中移除
[_soundIDDict removeObjectForKey:fileName];
}
}
然后我们在控制器中实现touchesEnded方法,在该方法中调用STAudioTool的播放音频方法:
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//音效文件的文件名,随机获取的
NSString *filename=[NSString stringWithFormat:@"m_%02d.wav",arc4random_uniform(14)+3];
//调用方法,播放音频
[STAudioTool playSound:filename];
}
这样,我们就实现了音频的播放,点击屏幕课随机播放音效。