实例解析iOSapp开发中音频文件播放工具类的封装剖析.docx

上传人:b****5 文档编号:3535028 上传时间:2022-11-23 格式:DOCX 页数:16 大小:18.03KB
下载 相关 举报
实例解析iOSapp开发中音频文件播放工具类的封装剖析.docx_第1页
第1页 / 共16页
实例解析iOSapp开发中音频文件播放工具类的封装剖析.docx_第2页
第2页 / 共16页
实例解析iOSapp开发中音频文件播放工具类的封装剖析.docx_第3页
第3页 / 共16页
实例解析iOSapp开发中音频文件播放工具类的封装剖析.docx_第4页
第4页 / 共16页
实例解析iOSapp开发中音频文件播放工具类的封装剖析.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

实例解析iOSapp开发中音频文件播放工具类的封装剖析.docx

《实例解析iOSapp开发中音频文件播放工具类的封装剖析.docx》由会员分享,可在线阅读,更多相关《实例解析iOSapp开发中音频文件播放工具类的封装剖析.docx(16页珍藏版)》请在冰豆网上搜索。

实例解析iOSapp开发中音频文件播放工具类的封装剖析.docx

实例解析iOSapp开发中音频文件播放工具类的封装剖析

实例解析iOSapp开发中音频文件播放工具类的封装

这篇文章主要介绍了iOSapp开发中音频文件播放工具类的封装,代码基于传统的Objective-C,需要的朋友可以参考下

一、简单说明

1.关于音乐播放的简单说明

(1)音乐播放用到一个叫做AVAudioPlayer的类

(2)AVAudioPlayer常用方法

  加载音乐文件

复制代码代码如下:

-(id)initWithContentsOfURL:

(NSURL*)urlerror:

(NSError**)outError;

-(id)initWithData:

(NSData*)dataerror:

(NSError**)outError;

  准备播放(缓冲,提高播放的流畅性) -(BOOL)prepareToPlay;

  播放(异步播放)-(BOOL)play;

暂停 -(void)pause;

停止-(void)stop;

是否正在播放

复制代码代码如下:

  @property(readonly,getter=isPlaying)BOOLplaying;

时长    

复制代码代码如下:

  @property(readonly)NSTimeIntervalduration;

当前的播放位

复制代码代码如下:

  @propertyNSTimeIntervalcurrentTime;

播放次数(-1代表无限循环播放,其他代表播放numberOfLoops+1次 @propertyNSIntegernumberOfLoops;

音量   

复制代码代码如下:

   @propertyfloatvolume;

是否允许更改速率

复制代码代码如下:

@propertyBOOLenableRate;

播放速率(1是正常速率,0.5是一般速率,2是双倍速率)

复制代码代码如下:

  @propertyfloatrate;

有多少个声道

复制代码代码如下:

 @property(readonly)NSUIntegernumberOfChannels;

2.播放多个音乐文件

说明:

如果要播放多个音乐文件,那么最傻瓜的做法是,创建多个全局的播放器去播放对应的音乐文件,但是这种方法无法适用于需要播放的文件数量巨大的情况。

  另外一种做法是:

自己封装一个播放音乐文件的工具类。

封装工具类的实现步骤:

  新建一个类,继承自NSObject类。

提供三个对外的接口:

分别是:

播放音乐(参数:

文件名,返回值:

BOOL)

暂停音乐(参数:

文件名)

停止音乐(参数:

文件名)

该工具类中的代码设计如下:

YYAudioTool.h文件

复制代码代码如下:

//

//YYAudioTool.h

//17-多个音乐文件的播放

//

//Createdbyappleon14-8-9.

//Copyright(c)2014年yangyong.Allrightsreserved.

//

#import

#import

@interfaceYYAudioTool:

NSObject

/**

*播放音乐文件

*/

+(BOOL)playMusic:

(NSString*)filename;

/**

*暂停播放

*/

+(void)pauseMusic:

(NSString*)filename;

/**

*播放音乐文件

*/

+(void)stopMusic:

(NSString*)filename;

@end

YYAudioTool.m文件

复制代码代码如下:

//

//YYAudioTool.m

//17-多个音乐文件的播放

//

//Createdbyappleon14-8-9.

//Copyright(c)2014年yangyong.Allrightsreserved.

//

#import"YYAudioTool.h"

@implementationYYAudioTool

/**

*存放所有的音乐播放器

*/

staticNSMutableDictionary*_musices;

+(NSMutableDictionary*)musices

{

if(_musices==nil){

_musices=[NSMutableDictionarydictionary];

}

return_musices;

}

/**

*播放音乐

*/

+(BOOL)playMusic:

(NSString*)filename

{

if(!

filename)returnNO;//如果没有传入文件名,那么直接返回

//1.取出对应的播放器

AVAudioPlayer*player=[selfmusices][filename];

//2.如果播放器没有创建,那么就进行初始化

if(!

player){

//2.1音频文件的URL

NSURL*url=[[NSBundlemainBundle]URLForResource:

filenamewithExtension:

nil];

if(!

url)returnNO;//如果url为空,那么直接返回

//2.2创建播放器

player=[[AVAudioPlayeralloc]initWithContentsOfURL:

urlerror:

nil];

//2.3缓冲

if(!

[playerprepareToPlay])returnNO;//如果缓冲失败,那么就直接返回

//2.4存入字典

[selfmusices][filename]=player;

}

//3.播放

if(!

[playerisPlaying]){

//如果当前没处于播放状态,那么就播放

return[playerplay];

}

returnYES;//正在播放,那么就返回YES

}

+(void)pauseMusic:

(NSString*)filename

{

if(!

filename)return;//如果没有传入文件名,那么就直接返回

//1.取出对应的播放器

AVAudioPlayer*player=[selfmusices][filename];

//2.暂停

[playerpause];//如果palyer为空,那相当于[nilpause],因此这里可以不用做处理

}

+(void)stopMusic:

(NSString*)filename

{

if(!

filename)return;//如果没有传入文件名,那么就直接返回

//1.取出对应的播放器

AVAudioPlayer*player=[selfmusices][filename];

//2.停止

[playerstop];

//3.将播放器从字典中移除

[[selfmusices]removeOForKey:

filename];

}

@end

测试程序:

在storyboard中拖拽控件,并进行连线,以做控制。

导入可供播放的音乐素材。

测试程序的代码设计如下:

复制代码代码如下:

//

//YYViewController.m

//17-多个音乐文件的播放

//

//Createdbyappleon14-8-9.

//Copyright(c)2014年yangyong.Allrightsreserved.

//

#import"YYViewController.h"

#import"YYAudioTool.h"

@interfaceYYViewController()

-(IBAction)play;

-(IBAction)pause;

-(IBAction)stop;

-(IBAction)next;

//用一个数组来保存所有的音乐文件

@property(nonatomic,strong)NSArray*songs;

//用一个int型的属性来记录当前的索引

@property(nonatomic,assign)intcurrentIndex;

@end

复制代码代码如下:

@implementationYYViewController

#pragmamark-懒加载

-(NSArray*)songs

{

if(_songs==nil){

self.songs=@[@"235319.mp3",@"309769.mp3",@"120125029.mp3"];

}

return_songs;

}

-(void)viewDidLoad

{

[superviewDidLoad];

}

-(IBAction)play{

//开始播放/继续播放

[YYAudioToolplayMusic:

self.songs[self.currentIndex]];

}

-(IBAction)pause{

//暂停播放

[YYAudioToolpauseMusic:

self.songs[self.currentIndex]];

}

-(IBAction)stop{

//停止播放

[YYAudioToolstopMusic:

self.songs[self.currentIndex]];

}

//播放下一首

-(IBAction)next{

//1.先停止当前播放

[selfstop];

//2.设置当前索引+1

self.currentIndex++;

if(self.currentIndex>=self.songs.count){

self.currentIndex=0;

}

//3.播放音乐

[selfplay];

}

@end

二、对工具类进行改造,让其兼能播放音效文件

说明:

  音效只有创建、播放和销毁(停止)三个操作,因为音效一般都很短,因此没有暂停的方法。

把对音效文件的播放加入到工具类中,实现的代码如下:

YYAudioTool.h文件

复制代码代码如下:

//

//YYAudioTool.h

//17-多个音乐文件的播放

//

//Createdbyappleon14-8-9.

//Copyright(c)2014年.Allrightsreserved.

//

#import

#import

@interfaceYYAudioTool:

NSObject

/**

*播放音乐文件

*/

+(BOOL)playMusic:

(NSString*)filename;

/**

*暂停播放

*/

+(void)pauseMusic:

(NSString*)filename;

/**

*播放音乐文件

*/

+(void)stopMusic:

(NSString*)filename;

/**

*播放音效文件

*/

+(void)playSound:

(NSString*)filename;

/**

*销毁音效

*/

+(void)disposeSound:

(NSString*)filename;

@end

YYAudioTool.m文件

//

//YYAudioTool.m

//17-多个音乐文件的播放

//

//Createdbyappleon14-8-9.

//Copyright(c)2014年yangyong.Allrightsreserved.

//

#import"YYAudioTool.h"

@implementationYYAudioTool

/**

*存放所有的音乐播放器

*/

staticNSMutableDictionary*_musicPlayers;

+(NSMutableDictionary*)musicPlayers

{

if(_musicPlayers==nil){

_musicPlayers=[NSMutableDictionarydictionary];

}

return_musicPlayers;

}

/**

*存放所有的音效ID

*/

staticNSMutableDictionary*_soundIDs;

+(NSMutableDictionary*)soundIDs

{

if(_soundIDs==nil){

_soundIDs=[NSMutableDictionarydictionary];

}

return_soundIDs;

}

/**

*播放音乐

*/

+(BOOL)playMusic:

(NSString*)filename

{

if(!

filename)returnNO;//如果没有传入文件名,那么直接返回

//1.取出对应的播放器

AVAudioPlayer*player=[selfmusicPlayers][filename];

//2.如果播放器没有创建,那么就进行初始化

if(!

player){

//2.1音频文件的URL

NSURL*url=[[NSBundlemainBundle]URLForResource:

filenamewithExtension:

nil];

if(!

url)returnNO;//如果url为空,那么直接返回

//2.2创建播放器

player=[[AVAudioPlayeralloc]initWithContentsOfURL:

urlerror:

nil];

//2.3缓冲

if(!

[playerprepareToPlay])returnNO;//如果缓冲失败,那么就直接返回

//2.4存入字典

[selfmusicPlayers][filename]=player;

}

//3.播放

if(!

[playerisPlaying]){

//如果当前没处于播放状态,那么就播放

return[playerplay];

}

returnYES;//正在播放,那么就返回YES

}

+(void)pauseMusic:

(NSString*)filename

{

if(!

filename)return;//如果没有传入文件名,那么就直接返回

//1.取出对应的播放器

AVAudioPlayer*player=[selfmusicPlayers][filename];

//2.暂停

[playerpause];//如果palyer为空,那相当于[nilpause],因此这里可以不用做处理

}

+(void)stopMusic:

(NSString*)filename

{

if(!

filename)return;//如果没有传入文件名,那么就直接返回

//1.取出对应的播放器

AVAudioPlayer*player=[selfmusicPlayers][filename];

//2.停止

[playerstop];

//3.将播放器从字典中移除

[[selfmusicPlayers]removeObjectForKey:

filename];

}

//播放音效

+(void)playSound:

(NSString*)filename

{

if(!

filename)return;

//1.取出对应的音效

SystemSoundIDsoundID=[[selfsoundIDs][filename]unsignedIntegerValue];

//2.播放音效

//2.1如果音效ID不存在,那么就创建

if(!

soundID){

//音效文件的URL

NSURL*url=[[NSBundlemainBundle]URLForResource:

filenamewithExtension:

nil];

if(!

url)return;//如果URL不存在,那么就直接返回

OSStatusstatus=AudioServicesCreateSystemSoundID((__bridgeCFURLRef)(url),&soundID);

NSLog(@"%ld",status);

//存入到字典中

[selfsoundIDs][filename]=@(soundID);

}

//2.2有音效ID后,播放音效

AudioServicesPlaySystemSound(soundID);

}

//销毁音效

+(void)disposeSound:

(NSString*)filename

{

//如果传入的文件名为空,那么就直接返回

if(!

filename)return;

//1.取出对应的音效

SystemSoundIDsoundID=[[selfsoundIDs][filename]unsignedIntegerValue];

//2.销毁

if(soundID){

AudioServicesDisposeSystemSoundID(soundID);

//2.1销毁后,从字典中移除

[[selfsoundIDs]removeObjectForKey:

filename];

}

}

@end

打印的值为0,播放成功(因为函数是C++中的)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 畜牧兽医

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1