iOS App中实现播放音效和音乐功能的简单示例

时间:2022-09-19 20:08:31

播放音效
ios开发过程中可能会遇到播放音效的功能
其实很简单,ios已经提供了一个框架直接负责播放音效 audiotoolbox.framework
新建项目  testwechatsounds

iOS App中实现播放音效和音乐功能的简单示例

iOS App中实现播放音效和音乐功能的简单示例

给新建的项目导入audiotoolbox.framework

iOS App中实现播放音效和音乐功能的简单示例

iOS App中实现播放音效和音乐功能的简单示例

导入成功之后如下图

iOS App中实现播放音效和音乐功能的简单示例

项目目录如下

iOS App中实现播放音效和音乐功能的简单示例

接下来我们给项目中添加几个caf格式的音效文件

iOS App中实现播放音效和音乐功能的简单示例

接下来 我们打开 项目默认生成的viewcontroller中添加代码
导入 audiotoolbox

复制代码 代码如下:

#import <audiotoolbox/audiotoolbox.h> 


给view上添加button点击之后播放音效

复制代码 代码如下:

- (void)viewdidload { 
    [super viewdidload]; 
    // do any additional setup after loading the view, typically from a nib. 
     
    uibutton *btn1=[[uibutton alloc] initwithframe:cgrectmake(20, 100, 120, 36)]; 
    [btn1 settitlecolor:[uicolor blackcolor] forstate:uicontrolstatenormal]; 
    [btn1 settitle:@"警告" forstate:uicontrolstatenormal]; 
    [btn1 addtarget:self action:@selector(btn1act) forcontrolevents:uicontroleventtouchupinside]; 
    [self.view addsubview:btn1]; 
     
    uibutton *btn2=[[uibutton alloc] initwithframe:cgrectmake(20, 150, 120, 36)]; 
    [btn2 settitlecolor:[uicolor blackcolor] forstate:uicontrolstatenormal]; 
    [btn2 settitle:@"错误" forstate:uicontrolstatenormal]; 
    [btn2 addtarget:self action:@selector(btn2act) forcontrolevents:uicontroleventtouchupinside]; 
    [self.view addsubview:btn2]; 


实现播放效果

复制代码 代码如下:

-(void)btn1act { 
     
    [self playsoundeffect:@"alarm.caf"]; 

-(void)btn2act { 
     
    [self playsoundeffect:@"ct-error.caf"]; 

 
-(void)playsoundeffect:(nsstring *)name{ 
    nsstring *audiofile=[[nsbundle mainbundle] pathforresource:name oftype:nil]; 
    nsurl *fileurl=[nsurl fileurlwithpath:audiofile]; 
    //1.获得系统声音id 
    systemsoundid soundid=0; 
    /**
     * infileurl:音频文件url
     * outsystemsoundid:声音id(此函数会将音效文件加入到系统音频服务中并返回一个长整形id)
     */ 
    audioservicescreatesystemsoundid((__bridge cfurlref)(fileurl), &soundid); 
    //如果需要在播放完之后执行某些操作,可以调用如下方法注册一个播放完成回调函数 
    audioservicesaddsystemsoundcompletion(soundid, null, null, soundcompletecallback, null); 
    //2.播放音频 
    audioservicesplaysystemsound(soundid);//播放音效 
    //    audioservicesplayalertsound(soundid);//播放音效并震动 

 
void soundcompletecallback(systemsoundid soundid,voidvoid * clientdata){ 
    nslog(@"播放完成..."); 


代码部分截图

 

iOS App中实现播放音效和音乐功能的简单示例

好了播放音效基本实现 。


播放音乐
我们同样使用苹果提供的框架 avfoundation.framework
首先,新建项目

iOS App中实现播放音效和音乐功能的简单示例

给项目起名: testavgoundation

iOS App中实现播放音效和音乐功能的简单示例

接下来导入framework

iOS App中实现播放音效和音乐功能的简单示例

 

导入成功之后如下

iOS App中实现播放音效和音乐功能的简单示例

项目结构

iOS App中实现播放音效和音乐功能的简单示例

开始写代码之前,我们找一首歌曲放到项目中
这里我们放一首比较经典的歌曲 周华健的 朋友

iOS App中实现播放音效和音乐功能的简单示例

同样我们还是打开项目默认生成的viewcontroller.m 在里面添加播放功能
首先,导入头文件

复制代码 代码如下:

#import <avfoundation/avfoundation.h>


接下来,创建个控件

复制代码 代码如下:

@property (nonatomic,strong) avaudioplayer *audioplayer;//播放器 
@property (strong, nonatomic) uiprogressview *playprogress;//播放进度 
@property (strong, nonatomic) uibutton *playorpause; //播放/暂停按钮(如果tag为0认为是暂停状态,1是播放状态) 
 
@property (strong ,nonatomic) nstimer *timer;//进度更新定时器 


初始化界面

复制代码 代码如下:

- (void)viewdidload { 
    [super viewdidload]; 
    // do any additional setup after loading the view, typically from a nib. 
    self.view.backgroundcolor=[uicolor lightgraycolor]; 
    [self inituserface]; 
     

 
-(void)inituserface{ 
     
    //添加playprogress 
     
    _playprogress= [[uiprogressview alloc] initwithprogressviewstyle: uiprogressviewstyledefault]; 
     
    _playprogress.frame=cgrectmake(0, 100, self.view.bounds.size.width, 36); 
     
    [self.view addsubview:_playprogress]; 
     
    //添加播放按钮 
    _playorpause=[[uibutton alloc]initwithframe:cgrectmake(0, 150, 120, 36)]; 
    [_playorpause settitle:@"播放" forstate:uicontrolstatenormal]; 
    [_playorpause settitlecolor:[uicolor blackcolor] forstate:uicontrolstatenormal]; 
    [_playorpause addtarget:self action:@selector(playorpauseact:) forcontrolevents:uicontroleventtouchupinside]; 
    [self.view addsubview:_playorpause]; 
     


添加几个播放,暂停,修改歌曲进度条显示的方法

复制代码 代码如下:

-(nstimer *)timer{ 
    if (!_timer) { 
        _timer=[nstimer scheduledtimerwithtimeinterval:0.5 target:self selector:@selector(updateprogress) userinfo:nil repeats:true]; 
    } 
    return _timer; 

 
-(avaudioplayer *)audioplayer{ 
    if (!_audioplayer) { 
        nsstring *urlstr=[[nsbundle mainbundle]pathforresource:@"朋友.mp3" oftype:nil]; 
        nsurl *url=[nsurl fileurlwithpath:urlstr]; 
        nserror *error=nil; 
        //初始化播放器,注意这里的url参数只能时文件路径,不支持http url 
        _audioplayer=[[avaudioplayer alloc]initwithcontentsofurl:url error:&error]; 
        //设置播放器属性 
        _audioplayer.numberofloops=0;//设置为0不循环 
        _audioplayer.delegate=self; 
        [_audioplayer preparetoplay];//加载音频文件到缓存 
        if(error){ 
            nslog(@"初始化播放器过程发生错误,错误信息:%@",error.localizeddescription); 
            return nil; 
        } 
    } 
    return _audioplayer; 

 
 
/**
 *  播放音频
 */ 
-(void)play{ 
    if (![self.audioplayer isplaying]) { 
        [self.audioplayer play]; 
        self.timer.firedate=[nsdate distantpast];//恢复定时器 
    } 

 
/**
 *  暂停播放
 */ 
-(void)pause{ 
    if ([self.audioplayer isplaying]) { 
        [self.audioplayer pause]; 
        self.timer.firedate=[nsdate distantfuture];//暂停定时器,注意不能调用invalidate方法,此方法会取消,之后无法恢复 
         
    } 

 
/**
 *  更新播放进度
 */ 
-(void)updateprogress{ 
    float progress= self.audioplayer.currenttime /self.audioplayer.duration; 
    [self.playprogress setprogress:progress animated:true]; 

 
#pragma mark - 播放器代理方法 
-(void)audioplayerdidfinishplaying:(avaudioplayer *)player successfully:(bool)flag{ 
    nslog(@"音乐播放完成..."); 
     
    [_playorpause settitle:@"播放" forstate:uicontrolstatenormal]; 
     


我们给播放按钮添加点击事件

复制代码 代码如下:

-(void)playorpauseact:(uibutton *)sender{ 
    nsstring *strplay=sender.titlelabel.text; 
    nslog(@"strplay=%@",strplay); 
    if ([strplay isequaltostring:@"播放"]) { 
        [sender settitle:@"暂停" forstate:uicontrolstatenormal]; 
        [self play]; 
    }else{ 
        [sender settitle:@"播放" forstate:uicontrolstatenormal]; 
        [self pause]; 
    } 


好了,到此 我们创建完成 可以运行试试

 

仔细的朋友可能发现我们的app播放音乐的过程中 如果切换到后台之后发现音乐暂停了  再次打开 又接着播放了
如果想要后台 也可以接着播放音乐 我们需要修改两个地方
1,打开项目 plist 文件

iOS App中实现播放音效和音乐功能的简单示例

添加一项

iOS App中实现播放音效和音乐功能的简单示例

2,打开viewcontroller.m 找到如下方法 添加一段

iOS App中实现播放音效和音乐功能的简单示例

好了 试下后台运行吧~