当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS App中实现播放音效和音乐功能的简单示例

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

标准日语初级教程,安全阀的作用,开运桃花陀罗尼

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

201633193440239.png (730×430)

201633193511334.png (730×430)

给新建的项目导入audiotoolbox.framework

201633193536489.png (1128×895)

201633193742629.png (400×460)

导入成功之后如下图

201633193805421.png (304×149)

项目目录如下

201633193846873.png (252×297)

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

201633193904175.png (231×326)

接下来 我们打开 项目默认生成的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(@"播放完成..."); 


代码部分截图

201633193930760.jpg (1131×791)

好了播放音效基本实现 。


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

201633193953166.png (730×430)

给项目起名: testavgoundation

201633194017611.png (730×430)

接下来导入framework

201633194046751.png (400×460)

导入成功之后如下

201633194102800.png (362×143)

项目结构

201633194126690.png (249×325)

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

201633194145282.png (248×309)

同样我们还是打开项目默认生成的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 文件

201633194211928.png (164×257)

添加一项

201633194233047.png (684×185)

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

201633194347772.jpg (704×378)

好了 试下后台运行吧~

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网