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