iOS之音频播放--AVFoundation框架的基本使用

来源:互联网 发布:蔡英文2017 知乎 编辑:程序博客网 时间:2024/06/05 23:53

本篇文章跟大家简单地介绍下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=[[NSBundlemainBundle]URLForResource:fileNamewithExtension:nil];

        

        if (!url)return;//如果url为空,则直接返回


        

        //创建音效ID

        AudioServicesCreateSystemSoundID((__bridgeCFURLRef _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);

        

        //从字典中移除

        [_soundIDDictremoveObjectForKey:fileName];

    }

}

然后我们在控制器中实现touchesEnded方法,在该方法中调用STAudioTool的播放音频方法:

-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

   //音效文件的文件名,随机获取的

    NSString *filename=[NSStringstringWithFormat:@"m_%02d.wav",arc4random_uniform(14)+3];

    //调用方法,播放音频

    [STAudioToolplaySound:filename];

}

这样,我们就实现了音频的播放,点击屏幕课随机播放音效。



2 0