iOS提供播放音频的方法:
- System Sound Services
- AVAudioPlayer
- MPMusicPlayerController
1 System Sound Services
System Sound Services 方式只适合播放一些很小的提示或警告音频。有一些限制:
- 声音长度不超过30s。
- 不能控制播放进度
- 声音文件必须是PCM或IMA4格式。
- 打包成.caf、.aif或.wav的文件
- 无循环播放和立体声控制
- 调用方法后立即播放声音
System Sound Service使用很简单。
1 由于System Sound Service 需要AudioToolbox框架的支持,所以需要导入AudioToolbox.framework。
2 并在需要的地方导入头文件
#import
<AudioToolbox/AudioToolbox.h>
/*
*System Sound Service
*/
- (void)systemSound {
NSLog(@"systemSound");
// 1.获得音效文件的路径
NSURL *url = [[NSBundle mainBundle] URLForResource:@"brid.caf" withExtension:nil];
// 2.加载音效文件,得到对应的音效ID 只需加载一次
SystemSoundID soundID = 0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);
//添加回调,播放完成后回调complemention 这一步可加可不加。
AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, (void *)complemention, NULL);
// 3.播放音效
AudioServicesPlaySystemSound(soundID);
//携带震动功能
//AudioServicesPlayAlertSound(soundID);
}
不用的时候可以释放音效资源:
AudioServicesDisposeSystemSoundID(soundID);
2 AVAudioPlayer
1 导入AVAudioPlayer.framework
2 引入头文件
#import
<AVFoundation/AVFoundation.h>
3 如果为audio player设置代理,则需实现协议
AVAudioPlayerDelegate
AVAudioPlayer有许多方法不一一说了。
<pre name="code" class="objc">- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSURL *url = [[NSBundle mainBundle] URLForResource:@"1201111234" withExtension:@".mp3"];
_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
//准备播放(缓冲,提高播放的流畅性)
[_audioPlayer prepareToPlay];
//循环次数
[_audioPlayer setNumberOfLoops:1];
//时长
NSLog(@"audio player duration:%f",[_audioPlayer duration]);
//为AudioPlayer设置代理,监听播放事件
_audioPlayer.delegate = self;
}
- (IBAction)palyAudioPlayer:(id)sender {
if(!_audioPlayer.isPlaying){
[_audioPlayer play];
}
}
- (IBAction)pauseAudioPlayer:(id)sender {
if(_audioPlayer.isPlaying){
[_audioPlayer pause];
}
}
- (IBAction)stopAudioPlayer:(id)sender {
[_audioPlayer stop];
}
//监听播放完
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
NSLog(@"finish playing flag:%d",flag);
}
3 MPMusicPlayerController
播放器类型两种:
- applicationMusicPlayer:该播放器是一种内置播放器,当程序退出后停止播放。
- iPodMusicPlayer:该播放器与iPod播放器内的信息相关,退出后不会停止播放。
使用其播放音乐步骤:
- 创建MPMusicPlayerController对象。(导入#import <MediaPlayer/MediaPlayer.h>)
- 调用MPMusicPlayerController对象的setQueueWithQuery:或setQueueWithItemCollection:方法设置将要播放的音乐队列。
调用MPMusicPlayerController对象的play、pause、stop控制播放。
对于其中的音乐队列,我们首先可以通过MPMediaPickerController选择系统音乐。
MPMediaPickerController继承了ViewController,可以当成视图控制器使用。
使用MPMediaPickerController步骤:
- 实现协议MPMediaPickerControllerDelegate。
- 创建MPMediaPickerController对象。
- 将MPMediaPickerController显示出来。
- (void)viewDidLoad
{
[super viewDidLoad];
UIBarButtonItem* bn = [[UIBarButtonItem alloc] initWithTitle:@"选择音乐"
style:UIBarButtonItemStyleBordered
target:self action:@selector(choose:)];
self.navigationItem.rightBarButtonItem = bn;
// 创建音乐播放器
//[MPMusicPlayerController applicationMusicPlayer]; 内部播放器,程序退出后停止播放
musicPlayer = [MPMusicPlayerController iPodMusicPlayer]; // 该播放器与iPod播放器内的信息相关,退出后不会停止播放。
// 创建MPMediaPickerController对象
mpc = [[MPMediaPickerController alloc]
initWithMediaTypes:MPMediaTypeAnyAudio];
// 为MPMediaPickerController设置委托
mpc.delegate = self;
// 设置选择音乐的提示文字。
mpc.prompt = @"请选择您喜欢的音乐";
// 设置是否允许进行多选
mpc.allowsPickingMultipleItems = YES;
// 设置是否允许选择云端音乐
mpc.showsCloudItems = YES;
}
显示方法:
// 必须以modal方式显示MPMusicPlayerController视图控制器
[self presentViewController: mpc animated:YES completion:NULL];
当选择音乐文件会激发协议的方法。
// 当用户选择指定音乐时激发该方法,mediaItemCollection代表用户选择的音乐
- (void)mediaPicker: (MPMediaPickerController *)mediaPicker
didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
NSLog(@"did pick mediaItems");
// 保存用户选择的音乐列表
itemList = mediaItemCollection;
// 将用户选择的音乐列表设置为musicPlayer的播放列表
[musicPlayer setQueueWithItemCollection:mediaItemCollection];
[self.tableView reloadData];
[mpc dismissViewControllerAnimated:YES completion:NULL];
}
- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker
{
NSLog(@"用户取消了选择");
}
选择成功后,就可以选择音乐进行 播放了。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
(NSIndexPath *)indexPath
{
// 获取表格行的行号
NSUInteger rowNo = indexPath.row;
// 设置播放器正要播放的音乐
musicPlayer.nowPlayingItem = [itemList.items objectAtIndex:rowNo];
// 开始播放
[musicPlayer play];
}