您的位置:首页 > 产品设计 > 产品经理

音频播放(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];
//后台播放
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: