音频播放(System Sound Services、MPMusicPlayerController、AVAudioplayer) for IOS
2015-10-26 14:22
615 查看
对于音频的播放ios提供了多种API,如AudioToolbox.framework下的System Sound Services、
AVFoundation.framework下的AVAudioplayer和MediaPlayer.framework下的MPMusicPlayerController。
音频的播放一般分为两种:音效播放和音乐播放。音效一般为比较短,并且对音乐的控制要求比较简单,如播放完一遍就ok,并且播放的过程中不需要做任何的处理;音乐播放相对于音效就复杂的多了,需要对播放时间和播放动作进行控制,如:播放,暂停,停止等。
下面在看一下各个API的特点:
1、System Sound Services: 适合播放一些很小的提示或警告铃声,有纯声音和振动并声音两种方式。可以播放的音乐格式有PCM或IMA4(IMA/ADPCM)格式,打包成.caf、.aif或者.wav的文件,还有一些特殊的.mp3。调用方法后立即播放音乐,不能控制播放的进度,没有循环播放和立体声控制。
2、AVAudioplayer:功能类似于一个功能强大的播放器,你能想到的播放器具有的功能基本都有,支持很多格式的音乐文件,这里就不一一说明了。缺点就是只能播放一个指定的文件,如果想继续播放可以重新创建另一个AVAudioPlayer的对象。
3、MPMusicPlayerController:功能比AVAudioplayer更强大的播放器,能播放多个音乐文件。一般配合MPMediaPickerController播放本地音乐库里的音乐文件。
综上所述:根据不同的需求可以选择不同的音频API来完成相应的功能:如只播放一些提示音可以选择System Sound Services,循环播放一段音乐可以选择AVAudioplayer,制作音乐播放器可以选择MPMusicPlayerController。
理论完毕,接下来上点干货:
1、System
Sound Services:
(1)创建系统音乐服务
SystemSoundID crash;
// 定义要播放的音频文件的URL
NSURL*crashUrl = [[NSBundlemainBundle]URLForResource:@"crash"withExtension:@"wav"];
// 加载音效文件
AudioServicesCreateSystemSoundID((__bridgeCFURLRef)crashUrl , &crash);
(2)播放音效
// 播放crash代表的音频
AudioServicesPlaySystemSound(crash);
// 播放crash代表的音频,并控制设备震动
AudioServicesPlayAlertSound(crash);
(3)停止播放
//停止播放crash
AudioServicesDisposeSystemSoundID(crash);
(4)播放完成后执行的动作
// 为crash播放完成绑定回调函数,当播放完成之后系统会自动调用回调方法(如果在回调方法里写入 播放的播放的方法,会形成死循环)
AudioServicesAddSystemSoundCompletion(crash,NULL,NULL,
(void*)completionCallback ,NULL);
回调函数的定义:
staticvoid completionCallback(SystemSoundID mySSID)
{
// Play again after sound play completion
AudioServicesPlaySystemSound(mySSID);
}
2、AVAudioplayer:
(1)创建AVAudioplayer对象,并设置其属性
// 获取要播放的音频文件的URL
NSURL* fileURL = [[NSBundlemainBundle]URLForResource:@"star"withExtension:@"mp3"];
// 创建AVAudioPlayer对象
AVAudioPlayer *audioPlayer = [[AVAudioPlayeralloc]initWithContentsOfURL:fileURL error:nil];
durationTime = audioPlayer.duration;
// 将循环次数设为-1,用于指定该音频文件循环播放
audioPlayer.numberOfLoops = -1;
// 为AVAudioPlayer设置代理,监听它的播放事件
audioPlayer.delegate =self;
(2)播放暂停和停止
[audioPlayer
play];
[audioPlayer
pause];
[audioPlayer stop];
(3)代理方法
// 当AVAudioPlayer播放完成收将会自动激发该方法
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (player ==audioPlayer && flag)
{
NSLog(@"播放完成!!");
[self.bn1setImage:playImageforState:UIControlStateNormal];
}
}
// 当AVAudioPlayer播放中断的时候(如打电话等),iOS9后就废除了
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player
{
if (player ==audioPlayer)
{
NSLog(@"被中断!!");
}
}
其余的请参考官方文档。
注意:AVAudioPlayer可以播放网络和本地的音乐。其他的属性请进入AVAudioPlayer.h中进行查看,这里就不一一讲述了。
3、MPMusicPlayerController:
(1)说到MPMusicPlayerController首先说一下MPMediaPickerController。MPMediaPickerController也位于MediaPlayer.framework下,提供从系统的音乐库中单选或者多选音乐的功能(可以为音乐文件或者音乐视频,其中音乐视频可以使用MPMoviePlayerController来播放)。
<1>创建MPMediaPickerController
// 创建MPMediaPickerController对象
MPMediaPickerController *mpc = [[MPMediaPickerControlleralloc] initWithMediaTypes:MPMediaTypeAnyAudio];
// 为MPMediaPickerController设置委托
mpc.delegate =self;
// 设置选择音乐的提示文字。
mpc.prompt =@"请选择您喜欢的音乐";
// 设置是否允许进行多选
mpc.allowsPickingMultipleItems =YES;
// 设置是否允许选择云端音乐
mpc.showsCloudItems =YES;
<2>代理方法
// 当用户选择指定音乐时激发该方法,mediaItemCollection代表用户选择的音乐
- (void)mediaPicker: (MPMediaPickerController *)mediaPicker
didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
//保存用户选择的音乐列表
itemList = mediaItemCollection;
//将用户选择的音乐列表设置为musicPlayer的播放列表
[musicPlayersetQueueWithItemCollection:mediaItemCollection];
[self.tableViewreloadData];
[mpcdismissViewControllerAnimated:YEScompletion:NULL];
}
//点击取消按钮触发的方法
- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker
{
NSLog(@"用户取消了选择");
}
注意获取算选择音乐的属性用valueForProperty方法:如下
[[itemList.itemsobjectAtIndex:rowNo]
valueForProperty:MPMediaItemPropertyTitle];
具体属性这里就不多解释了。
(2)穿件音乐播放器
// 创建音乐播放器
MPMusicPlayerController *musicPlayer = [MPMusicPlayerControlleriPodMusicPlayer];
初始化方法有以下三种:
看一下区别:
applicationMusicPlayer:当应用程序进入后台的时候,播放停止;
systemMusicPlayer 和 iPodMusicPlayer:systemMusicPlayer是ios9中用来替换iPodMusicPlayer,当程序进入后台的时候,播放不会停止。
(3)播放暂停停止
[musicPlayer
play];
[musicPlayer
pause];
[musicPlayer
stop];
(4)播放状态和一些必要的属性在MPMusicPlayerController.h文件中一看便知。
对于音乐播放来说,后台播放才是王道;so,接下来说一下后台播放音乐
注意:测试的时候,模拟器后台音乐照常运行,所以请使用真机。
1、info.plist中设置
2、在AppDelegate中添加头文件:#import
<AVFoundation/AVFoundation.h>
使用AVAudioSession
- (void)applicationWillResignActive:(UIApplication *)application {
//后台支持接收远程控制事件
// [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//核心代码
AVAudioSession *session = [AVAudioSession
sharedInstance];
[session
setActive:YES
error:nil];
[session setCategory:AVAudioSessionCategoryPlayback
error:nil];
//后台播放
}
AVFoundation.framework下的AVAudioplayer和MediaPlayer.framework下的MPMusicPlayerController。
音频的播放一般分为两种:音效播放和音乐播放。音效一般为比较短,并且对音乐的控制要求比较简单,如播放完一遍就ok,并且播放的过程中不需要做任何的处理;音乐播放相对于音效就复杂的多了,需要对播放时间和播放动作进行控制,如:播放,暂停,停止等。
下面在看一下各个API的特点:
1、System Sound Services: 适合播放一些很小的提示或警告铃声,有纯声音和振动并声音两种方式。可以播放的音乐格式有PCM或IMA4(IMA/ADPCM)格式,打包成.caf、.aif或者.wav的文件,还有一些特殊的.mp3。调用方法后立即播放音乐,不能控制播放的进度,没有循环播放和立体声控制。
2、AVAudioplayer:功能类似于一个功能强大的播放器,你能想到的播放器具有的功能基本都有,支持很多格式的音乐文件,这里就不一一说明了。缺点就是只能播放一个指定的文件,如果想继续播放可以重新创建另一个AVAudioPlayer的对象。
3、MPMusicPlayerController:功能比AVAudioplayer更强大的播放器,能播放多个音乐文件。一般配合MPMediaPickerController播放本地音乐库里的音乐文件。
综上所述:根据不同的需求可以选择不同的音频API来完成相应的功能:如只播放一些提示音可以选择System Sound Services,循环播放一段音乐可以选择AVAudioplayer,制作音乐播放器可以选择MPMusicPlayerController。
理论完毕,接下来上点干货:
1、System
Sound Services:
(1)创建系统音乐服务
SystemSoundID crash;
// 定义要播放的音频文件的URL
NSURL*crashUrl = [[NSBundlemainBundle]URLForResource:@"crash"withExtension:@"wav"];
// 加载音效文件
AudioServicesCreateSystemSoundID((__bridgeCFURLRef)crashUrl , &crash);
(2)播放音效
// 播放crash代表的音频
AudioServicesPlaySystemSound(crash);
// 播放crash代表的音频,并控制设备震动
AudioServicesPlayAlertSound(crash);
(3)停止播放
//停止播放crash
AudioServicesDisposeSystemSoundID(crash);
(4)播放完成后执行的动作
// 为crash播放完成绑定回调函数,当播放完成之后系统会自动调用回调方法(如果在回调方法里写入 播放的播放的方法,会形成死循环)
AudioServicesAddSystemSoundCompletion(crash,NULL,NULL,
(void*)completionCallback ,NULL);
回调函数的定义:
staticvoid completionCallback(SystemSoundID mySSID)
{
// Play again after sound play completion
AudioServicesPlaySystemSound(mySSID);
}
2、AVAudioplayer:
(1)创建AVAudioplayer对象,并设置其属性
// 获取要播放的音频文件的URL
NSURL* fileURL = [[NSBundlemainBundle]URLForResource:@"star"withExtension:@"mp3"];
// 创建AVAudioPlayer对象
AVAudioPlayer *audioPlayer = [[AVAudioPlayeralloc]initWithContentsOfURL:fileURL error:nil];
durationTime = audioPlayer.duration;
// 将循环次数设为-1,用于指定该音频文件循环播放
audioPlayer.numberOfLoops = -1;
// 为AVAudioPlayer设置代理,监听它的播放事件
audioPlayer.delegate =self;
(2)播放暂停和停止
[audioPlayer
play];
[audioPlayer
pause];
[audioPlayer stop];
(3)代理方法
// 当AVAudioPlayer播放完成收将会自动激发该方法
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (player ==audioPlayer && flag)
{
NSLog(@"播放完成!!");
[self.bn1setImage:playImageforState:UIControlStateNormal];
}
}
// 当AVAudioPlayer播放中断的时候(如打电话等),iOS9后就废除了
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player
{
if (player ==audioPlayer)
{
NSLog(@"被中断!!");
}
}
其余的请参考官方文档。
注意:AVAudioPlayer可以播放网络和本地的音乐。其他的属性请进入AVAudioPlayer.h中进行查看,这里就不一一讲述了。
3、MPMusicPlayerController:
(1)说到MPMusicPlayerController首先说一下MPMediaPickerController。MPMediaPickerController也位于MediaPlayer.framework下,提供从系统的音乐库中单选或者多选音乐的功能(可以为音乐文件或者音乐视频,其中音乐视频可以使用MPMoviePlayerController来播放)。
<1>创建MPMediaPickerController
// 创建MPMediaPickerController对象
MPMediaPickerController *mpc = [[MPMediaPickerControlleralloc] initWithMediaTypes:MPMediaTypeAnyAudio];
// 为MPMediaPickerController设置委托
mpc.delegate =self;
// 设置选择音乐的提示文字。
mpc.prompt =@"请选择您喜欢的音乐";
// 设置是否允许进行多选
mpc.allowsPickingMultipleItems =YES;
// 设置是否允许选择云端音乐
mpc.showsCloudItems =YES;
<2>代理方法
// 当用户选择指定音乐时激发该方法,mediaItemCollection代表用户选择的音乐
- (void)mediaPicker: (MPMediaPickerController *)mediaPicker
didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
//保存用户选择的音乐列表
itemList = mediaItemCollection;
//将用户选择的音乐列表设置为musicPlayer的播放列表
[musicPlayersetQueueWithItemCollection:mediaItemCollection];
[self.tableViewreloadData];
[mpcdismissViewControllerAnimated:YEScompletion:NULL];
}
//点击取消按钮触发的方法
- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker
{
NSLog(@"用户取消了选择");
}
注意获取算选择音乐的属性用valueForProperty方法:如下
[[itemList.itemsobjectAtIndex:rowNo]
valueForProperty:MPMediaItemPropertyTitle];
具体属性这里就不多解释了。
(2)穿件音乐播放器
// 创建音乐播放器
MPMusicPlayerController *musicPlayer = [MPMusicPlayerControlleriPodMusicPlayer];
初始化方法有以下三种:
看一下区别:
applicationMusicPlayer:当应用程序进入后台的时候,播放停止;
systemMusicPlayer 和 iPodMusicPlayer:systemMusicPlayer是ios9中用来替换iPodMusicPlayer,当程序进入后台的时候,播放不会停止。
(3)播放暂停停止
[musicPlayer
play];
[musicPlayer
pause];
[musicPlayer
stop];
(4)播放状态和一些必要的属性在MPMusicPlayerController.h文件中一看便知。
对于音乐播放来说,后台播放才是王道;so,接下来说一下后台播放音乐
注意:测试的时候,模拟器后台音乐照常运行,所以请使用真机。
1、info.plist中设置
2、在AppDelegate中添加头文件:#import
<AVFoundation/AVFoundation.h>
使用AVAudioSession
- (void)applicationWillResignActive:(UIApplication *)application {
//后台支持接收远程控制事件
// [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//核心代码
AVAudioSession *session = [AVAudioSession
sharedInstance];
[session
setActive:YES
error:nil];
[session setCategory:AVAudioSessionCategoryPlayback
error:nil];
//后台播放
}
相关文章推荐
- 概率矩阵分解模型 PMF
- APM飞控修改数传模块方法
- RPM包制作方法
- 用户体验学习笔记(工程中发现的PM常犯错误)
- PM俱乐部之旅7-弱活着
- 绩效考核:要想落地应该这样做
- npm ERR!无法安装任何包的解决办法
- centeOS6.5 RPM方式安装MySQL5.6
- cnetos 6----install ---- rpmfusion
- 如果我来应聘产品经理岗位(一)
- 听腾讯产品经理从 12306 和 “写简历” 这些事聊聊用户体验
- 关 于 yum rpm 的 类 习 题
- npm package.json中的dependencies和devDependencies的区别
- PMP考试中的项目管理知识领域
- sap workflow and BPM
- 360资深产品经理:新人如何成功面试产品经理
- ALSA声卡驱动中的DAPM详解之一:kcontrol
- OneAPM 技术公开课:北京,北京!
- OneAPM 技术公开课:北京,北京!
- 产品经理常用工具