300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > iOS音效和音乐播放

iOS音效和音乐播放

时间:2022-10-16 13:29:43

相关推荐

iOS音效和音乐播放

在iOS中音频播放从形式上可以分为音效播放和音乐播放。前者主要指的是一些短音频播放,通常作为点缀音频,对于这类音频不需要进行进度、循环等控制。后者指的是一些较长的音频,通常是主音频,对于这些音频的播放通常需要进行精确的控制。在iOS中播放两类音频分别使用AudioToolbox.framework和AVFoundation.framework来完成音效和音乐播放。

音效

AudioToolbox.framework是一套基于C语言的框架,使用它来播放音效其本质是将短音频注册到系统声音服务(System Sound Service)。System Sound Service是一种简单、底层的声音播放服务,但是它本身也存在着一些限制:

音频播放时间不能超过30s数据必须是PCM或者IMA4格式音频文件必须打包成.caf、.aif、.wav中的一种(注意这是官方文档的说法,实际测试发现一些.mp3也可以播放)

使用System Sound Service 播放音效的步骤如下:

调用AudioServicesCreateSystemSoundID( CFURLRef inFileURL, SystemSoundID* outSystemSoundID)函数获得系统声音ID。如果需要监听播放完成操作,则使用AudioServicesAddSystemSoundCompletion( SystemSoundID inSystemSoundID,

CFRunLoopRef inRunLoop, CFStringRef inRunLoopMode, AudioServicesSystemSoundCompletionProc inCompletionRoutine, void* inClientData)方法注册回调函数。调用AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)或者AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)方法播放音效(后者带有震动效果)。 下面是一个简单的示例程序:

//// LVMainViewController.m// Audio//// Created by lamshaoquan on 14/03/30.// Copyright (c) lvstudio. All rights reserved.// 音效播放#import "<span style="line-height: 25.2000007629395px; font-family: Georgia, 'Times New Roman', Times, sans-serif;">LVMainViewController</span><span style="line-height: 25.2000007629395px; font-family: Georgia, 'Times New Roman', Times, sans-serif;">.h"</span>#import <AudioToolbox/AudioToolbox.h>@interface <span style="line-height: 25.2000007629395px; font-family: Georgia, 'Times New Roman', Times, sans-serif;">LVMainViewController</span><span style="line-height: 25.2000007629395px; font-family: Georgia, 'Times New Roman', Times, sans-serif;"> ()</span>@end@implementation LVMainViewController- (void)viewDidLoad {[super viewDidLoad];[self playSoundEffect:@"videoRing.caf"];}/*** 播放完成回调函数** @param soundID 系统声音ID* @param clientData 回调时传递的数据*/void soundCompleteCallback(SystemSoundID soundID,void * clientData){NSLog(@"播放完成...");}/*** 播放音效文件** @param name 音频文件名称*/-(void)playSoundEffect:(NSString *)name{NSString *audioFile=[[NSBundle mainBundle] pathForResource:name ofType:nil];NSURL *fileUrl=[NSURL fileURLWithPath:audioFile];//1.获得系统声音IDSystemSoundID soundID=0;/*** inFileUrl:音频文件url* outSystemSoundID:声音id(此函数会将音效文件加入到系统音频服务中并返回一个长整形ID)*/AudioServicesCreateSystemSoundID((__bridge CFURLRef)(fileUrl), &soundID);//如果需要在播放完之后执行某些操作,可以调用如下方法注册一个播放完成回调函数AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, soundCompleteCallback, NULL);//2.播放音频AudioServicesPlaySystemSound(soundID);//播放音效// AudioServicesPlayAlertSound(soundID);//播放音效并震动}@end

音乐

如果播放较大的音频或者要对音频有精确的控制则System Sound Service可能就很难满足实际需求了,通常这种情况会选择使用AVFoundation.framework中的AVAudioPlayer来实现。AVAudioPlayer可以看成一个播放器,它支持多种 音频格式 ,而且能够进行进度、音量、播放速度等控制。首先简单看一下AVAudioPlayer常用的属性和方法:

AVAudioPlayer的使用比较简单:

初始化AVAudioPlayer对象,此时通常指定本地文件路径。设置播放器属性,例如重复次数、音量大小等。调用play方法播放。运行效果:

下面就使用AVAudioPlayer实现一个简单播放器,在这个播放器中实现了播放、暂停、显示播放进度功能,当然例如调节音量、设置循环模式、甚至是声波图像(通过分析音频分贝值)等功能都可以实现,这里就不再一一演示。界面效果如下:

当然由于AVAudioPlayer一次只能播放一个音频文件,所有上一曲、下一曲其实可以通过创建多个播放器对象来完成,这里暂不实现。播放进度的实现主要依靠一个定时器实时计算当前播放时长和音频总时长的比例,另外为了演示委托方法,下面的代码中也实现了播放完成委托方法,通常如果有下一曲功能的话播放完可以触发下一曲音乐播放。下面是主要代码:

//// ViewController.m// LVAVAudioPlayer//// Created by lamshaoquan on 14/03/30.// Copyright (c) lvstudio. All rights reserved.//#import "ViewController.h"#import <AVFoundation/AVFoundation.h>#define kMusicFile @"刘若英 - 原来你也在这里.mp3"#define kMusicSinger @"刘若英"#define kMusicTitle @"原来你也在这里"@interface ViewController ()<AVAudioPlayerDelegate>@property (nonatomic,strong) AVAudioPlayer *audioPlayer;//播放器@property (weak, nonatomic) IBOutlet UILabel *controlPanel; //控制面板@property (weak, nonatomic) IBOutlet UIProgressView *playProgress;//播放进度@property (weak, nonatomic) IBOutlet UILabel *musicSinger; //演唱者@property (weak, nonatomic) IBOutlet UIButton *playOrPause; //播放/暂停按钮(如果tag为0认为是暂停状态,1是播放状态)@property (weak ,nonatomic) NSTimer *timer;//进度更新定时器@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];[self setupUI];}/*** 初始化UI*/-(void)setupUI{self.title=kMusicTitle;self.musicSinger.text=kMusicSinger;}-(NSTimer *)timer{if (!_timer) {_timer=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateProgress) userInfo:nil repeats:true];}return _timer;}/*** 创建播放器** @return 音频播放器*/-(AVAudioPlayer *)audioPlayer{if (!_audioPlayer) {NSString *urlStr=[[NSBundle mainBundle]pathForResource:kMusicFile ofType:nil];NSURL *url=[NSURL fileURLWithPath:urlStr];NSError *error=nil;//初始化播放器,注意这里的Url参数只能时文件路径,不支持HTTP Url_audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];//设置播放器属性_audioPlayer.numberOfLoops=0;//设置为0不循环_audioPlayer.delegate=self;[_audioPlayer prepareToPlay];//加载音频文件到缓存if(error){NSLog(@"初始化播放器过程发生错误,错误信息:%@",error.localizedDescription);return nil;}}return _audioPlayer;}/*** 播放音频*/-(void)play{if (![self.audioPlayer isPlaying]) {[self.audioPlayer play];self.timer.fireDate=[NSDate distantPast];//恢复定时器}}/*** 暂停播放*/-(void)pause{if ([self.audioPlayer isPlaying]) {[self.audioPlayer pause];self.timer.fireDate=[NSDate distantFuture];//暂停定时器,注意不能调用invalidate方法,此方法会取消,之后无法恢复}}/*** 点击播放/暂停按钮** @param sender 播放/暂停按钮*/- (IBAction)playClick:(UIButton *)sender {if(sender.tag){sender.tag=0;[sender setImage:[UIImage imageNamed:@"playing_btn_play_n"] forState:UIControlStateNormal];[sender setImage:[UIImage imageNamed:@"playing_btn_play_h"] forState:UIControlStateHighlighted];[self pause];}else{sender.tag=1;[sender setImage:[UIImage imageNamed:@"playing_btn_pause_n"] forState:UIControlStateNormal];[sender setImage:[UIImage imageNamed:@"playing_btn_pause_h"] forState:UIControlStateHighlighted];[self play];}}/*** 更新播放进度*/-(void)updateProgress{float progress= self.audioPlayer.currentTime /self.audioPlayer.duration;[self.playProgress setProgress:progress animated:true];}#pragma mark - 播放器代理方法-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{NSLog(@"音乐播放完成...");}@end

运行效果:

音频会话

事实上上面的播放器还存在一些问题,例如通常我们看到的播放器即使退出到后台也是可以播放的,而这个播放器如果退出到后台它会自动暂停。如果要支持后台播放需要做下面几件事情:

事实上上面的播放器还存在一些问题,例如通常我们看到的播放器即使退出到后台也是可以播放的,而这个播放器如果退出到后台它会自动暂停。如果要支持后台播放需要做下面几件事情:

1.设置后台运行模式:在plist文件中添加Required background modes,并且设置item 0=App plays audio or streams audio/video using AirPlay(其实可以直接通过Xcode在Project Targets-Capabilities-Background Modes中设置)

2.设置AVAudioSession的类型为AVAudioSessionCategoryPlayback并且调用setActive::方法启动会话。

AVAudioSession *audioSession=[AVAudioSession sharedInstance];[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];[audioSession setActive:YES error:nil];

3.为了能够让应用退到后台之后支持耳机控制,建议添加远程控制事件(这一步不是后台播放必须的)

前两步是后台播放所必须设置的,第三步主要用于接收远程事件,这部分内容之前的文章中有详细介绍,如果这一步不设置虽让也能够在后台播放,但是无法获得音频控制权(如果在使用当前应用之前使用其他播放器播放音乐的话,此时如果按耳机播放键或者控制中心的播放按钮则会播放前一个应用的音频),并且不能使用耳机进行音频控制。第一步操作相信大家都很容易理解,如果应用程序要允许运行到后台必须设置,正常情况下应用如果进入后台会被挂起,通过该设置可以上应用程序继续在后台运行。但是第二步使用的AVAudioSession有必要进行一下详细的说明。

在iOS中每个应用都有一个音频会话,这个会话就通过AVAudioSession来表示。AVAudioSession同样存在于AVFoundation框架中,它是单例模式设计,通过sharedInstance进行访问。在使用Apple设备时大家会发现有些应用只要打开其他音频播放就会终止,而有些应用却可以和其他应用同时播放,在多种音频环境中如何去控制播放的方式就是通过音频会话来完成的。下面是音频会话的几种会话模式:

注意:是否遵循静音键表示在播放过程中如果用户通过硬件设置为静音是否能关闭声音。

根据前面对音频会话的理解,相信大家开发出能够在后台播放的音频播放器并不难,但是注意一下,在前面的代码中也提到设置完音频会话类型之后需要调用setActive::方法将会话激活才能起作用。类似的,如果一个应用已经在播放音频,打开我们的应用之后设置了在后台播放的会话类型,此时其他应用的音频会停止而播放我们的音频,如果希望我们的程序音频播放完之后(关闭或退出到后台之后)能够继续播放其他应用的音频的话则可以调用setActive::方法关闭会话。代码如下:

//// ViewController.m// LVAVAudioPlayer//// Created by lamshaoquan on 14/03/30.// Copyright (c) lvstudio. All rights reserved.// AVAudioSession 音频会话#import "ViewController.h"#import <AVFoundation/AVFoundation.h>#define kMusicFile @"刘若英 - 原来你也在这里.mp3"#define kMusicSinger @"刘若英"#define kMusicTitle @"原来你也在这里"@interface ViewController ()<AVAudioPlayerDelegate>@property (nonatomic,strong) AVAudioPlayer *audioPlayer;//播放器@property (weak, nonatomic) IBOutlet UILabel *controlPanel; //控制面板@property (weak, nonatomic) IBOutlet UIProgressView *playProgress;//播放进度@property (weak, nonatomic) IBOutlet UILabel *musicSinger; //演唱者@property (weak, nonatomic) IBOutlet UIButton *playOrPause; //播放/暂停按钮(如果tag为0认为是暂停状态,1是播放状态)@property (weak ,nonatomic) NSTimer *timer;//进度更新定时器@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];[self setupUI];}/*** 显示当面视图控制器时注册远程事件** @param animated 是否以动画的形式显示*/-(void)viewWillAppear:(BOOL)animated{[super viewWillAppear:animated];//开启远程控制[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];//作为第一响应者//[self becomeFirstResponder];}/*** 当前控制器视图不显示时取消远程控制** @param animated 是否以动画的形式消失*/-(void)viewWillDisappear:(BOOL)animated{[super viewWillDisappear:animated];[[UIApplication sharedApplication] endReceivingRemoteControlEvents];//[self resignFirstResponder];}/*** 初始化UI*/-(void)setupUI{self.title=kMusicTitle;self.musicSinger.text=kMusicSinger;}-(NSTimer *)timer{if (!_timer) {_timer=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateProgress) userInfo:nil repeats:true];}return _timer;}/*** 创建播放器** @return 音频播放器*/-(AVAudioPlayer *)audioPlayer{if (!_audioPlayer) {NSString *urlStr=[[NSBundle mainBundle]pathForResource:kMusicFile ofType:nil];NSURL *url=[NSURL fileURLWithPath:urlStr];NSError *error=nil;//初始化播放器,注意这里的Url参数只能时文件路径,不支持HTTP Url_audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];//设置播放器属性_audioPlayer.numberOfLoops=0;//设置为0不循环_audioPlayer.delegate=self;[_audioPlayer prepareToPlay];//加载音频文件到缓存if(error){NSLog(@"初始化播放器过程发生错误,错误信息:%@",error.localizedDescription);return nil;}//设置后台播放模式AVAudioSession *audioSession=[AVAudioSession sharedInstance];[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];// [audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:nil];[audioSession setActive:YES error:nil];//添加通知,拔出耳机后暂停播放[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(routeChange:) name:AVAudioSessionRouteChangeNotification object:nil];}return _audioPlayer;}/*** 播放音频*/-(void)play{if (![self.audioPlayer isPlaying]) {[self.audioPlayer play];self.timer.fireDate=[NSDate distantPast];//恢复定时器}}/*** 暂停播放*/-(void)pause{if ([self.audioPlayer isPlaying]) {[self.audioPlayer pause];self.timer.fireDate=[NSDate distantFuture];//暂停定时器,注意不能调用invalidate方法,此方法会取消,之后无法恢复}}/*** 点击播放/暂停按钮** @param sender 播放/暂停按钮*/- (IBAction)playClick:(UIButton *)sender {if(sender.tag){sender.tag=0;[sender setImage:[UIImage imageNamed:@"playing_btn_play_n"] forState:UIControlStateNormal];[sender setImage:[UIImage imageNamed:@"playing_btn_play_h"] forState:UIControlStateHighlighted];[self pause];}else{sender.tag=1;[sender setImage:[UIImage imageNamed:@"playing_btn_pause_n"] forState:UIControlStateNormal];[sender setImage:[UIImage imageNamed:@"playing_btn_pause_h"] forState:UIControlStateHighlighted];[self play];}}/*** 更新播放进度*/-(void)updateProgress{float progress= self.audioPlayer.currentTime /self.audioPlayer.duration;[self.playProgress setProgress:progress animated:true];}/*** 一旦输出改变则执行此方法** @param notification 输出改变通知对象*/-(void)routeChange:(NSNotification *)notification{NSDictionary *dic=notification.userInfo;int changeReason= [dic[AVAudioSessionRouteChangeReasonKey] intValue];//等于AVAudioSessionRouteChangeReasonOldDeviceUnavailable表示旧输出不可用if (changeReason==AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {AVAudioSessionRouteDescription *routeDescription=dic[AVAudioSessionRouteChangePreviousRouteKey];AVAudioSessionPortDescription *portDescription= [routeDescription.outputs firstObject];//原设备为耳机则暂停if ([portDescription.portType isEqualToString:@"Headphones"]) {[self pause];}}// [dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {// NSLog(@"%@:%@",key,obj);// }];}-(void)dealloc{[[NSNotificationCenter defaultCenter] removeObserver:self name:AVAudioSessionRouteChangeNotification object:nil];}#pragma mark - 播放器代理方法-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{NSLog(@"音乐播放完成...");//根据实际情况播放完成可以将会话关闭,其他音频应用继续播放[[AVAudioSession sharedInstance]setActive:NO error:nil];}@end

在上面的代码中还实现了拔出耳机暂停音乐播放的功能,这也是一个比较常见的功能。在iOS7及以后的版本中可以通过通知获得输出改变的通知,然后拿到通知对象后根据userInfo获得是何种改变类型,进而根据情况对音乐进行暂停操作。

扩展--播放音乐库中的音乐

众所周知音乐是iOS的重要组成播放,无论是iPod、iTouch、iPhone还是iPad都可以在iTunes购买音乐或添加本地音乐到音乐库中同步到你的iOS设备。在MediaPlayer.frameowork中有一个MPMusicPlayerController用于播放音乐库中的音乐。

下面先来看一下MPMusicPlayerController的常用属性和方法:

MPMusicPlayerController有两种播放器:applicationMusicPlayer和systemMusicPlayer,前者在应用退出后音乐播放会自动停止,后者在应用停止后不会退出播放状态。MPMusicPlayerController加载音乐不同于前面的AVAudioPlayer是通过一个文件路径来加载,而是需要一个播放队列。在MPMusicPlayerController中提供了两个方法来加载播放队列:- (void)setQueueWithQuery:(MPMediaQuery *)query- (void)setQueueWithItemCollection:(MPMediaItemCollection *)itemCollection,正是由于它的播放音频来源是一个队列,因此MPMusicPlayerController支持上一曲、下一曲等操作。

那么接下来的问题就是如何获取MPMediaQueue或者MPMediaItemCollection?MPMediaQueue对象有一系列的类方法来获得媒体队列:

+ (MPMediaQuery *)albumsQuery;

+ (MPMediaQuery *)artistsQuery;

+ (MPMediaQuery *)songsQuery;

+ (MPMediaQuery *)playlistsQuery;

+ (MPMediaQuery *)podcastsQuery;

+ (MPMediaQuery *)audiobooksQuery;

+ (MPMediaQuery *)compilationsQuery;

+ (MPMediaQuery *)composersQuery;

+ (MPMediaQuery *)genresQuery;

有了这些方法,就可以很容易获到歌曲、播放列表、专辑媒体等媒体队列了,这样就可以通过:- (void)setQueueWithQuery:(MPMediaQuery *)query方法设置音乐来源了又或者得到MPMediaQueue之后创建MPMediaItemCollection,使用- (void)setQueueWithItemCollection:(MPMediaItemCollection *)itemCollection设置音乐来源。

有时候可能希望用户自己来选择要播放的音乐,这时可以使用MPMediaPickerController,它是一个视图控制器,类似于UIImagePickerController,选择完播放来源后可以在其代理方法中获得MPMediaItemCollection对象。

无论是通过哪种方式获得MPMusicPlayerController的媒体源,可能都希望将每个媒体的信息显示出来,这时候可以通过MPMediaItem对象获得。一个MPMediaItem代表一个媒体文件,通过它可以访问媒体标题、专辑名称、专辑封面、音乐时长等等。无论是MPMediaQueue还是MPMediaItemCollection都有一个items属性,它是MPMediaItem数组,通过这个属性可以获得MPMediaItem对象。

下面就简单看一下MPMusicPlayerController的使用,在下面的例子中简单演示了音乐的选择、播放、暂停、通知、下一曲、上一曲功能,相信有了上面的概念,代码读起来并不复杂(示例中是直接通过MPMeidaPicker进行音乐选择的,但是仍然提供了两个方法getLocalMediaQuery和getLocalMediaItemCollection来演示如何直接通过MPMediaQueue获得媒体队列或媒体集合):

//// ViewController.m// MPMusicPlayerController//// Created by lamshaoquan 14/03/30// Copyright (c) lvstudio. All rights reserved.//#import "ViewController.h"#import <MediaPlayer/MediaPlayer.h>@interface ViewController ()<MPMediaPickerControllerDelegate>@property (nonatomic,strong) MPMediaPickerController *mediaPicker;//媒体选择控制器@property (nonatomic,strong) MPMusicPlayerController *musicPlayer; //音乐播放器@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];}-(void)dealloc{[self.musicPlayer endGeneratingPlaybackNotifications];}/*** 获得音乐播放器** @return 音乐播放器*/-(MPMusicPlayerController *)musicPlayer{if (!_musicPlayer) {_musicPlayer=[MPMusicPlayerController systemMusicPlayer];[_musicPlayer beginGeneratingPlaybackNotifications];//开启通知,否则监控不到MPMusicPlayerController的通知[self addNotification];//添加通知//如果不使用MPMediaPickerController可以使用如下方法获得音乐库媒体队列//[_musicPlayer setQueueWithItemCollection:[self getLocalMediaItemCollection]];}return _musicPlayer;}/*** 创建媒体选择器** @return 媒体选择器*/-(MPMediaPickerController *)mediaPicker{if (!_mediaPicker) {//初始化媒体选择器,这里设置媒体类型为音乐,其实这里也可以选择视频、广播等// _mediaPicker=[[MPMediaPickerController alloc]initWithMediaTypes:MPMediaTypeMusic];_mediaPicker=[[MPMediaPickerController alloc]initWithMediaTypes:MPMediaTypeAny];_mediaPicker.allowsPickingMultipleItems=YES;//允许多选// _mediaPicker.showsCloudItems=YES;//显示icloud选项_mediaPicker.prompt=@"请选择要播放的音乐";_mediaPicker.delegate=self;//设置选择器代理}return _mediaPicker;}/*** 取得媒体队列** @return 媒体队列*/-(MPMediaQuery *)getLocalMediaQuery{MPMediaQuery *mediaQueue=[MPMediaQuery songsQuery];for (MPMediaItem *item in mediaQueue.items) {NSLog(@"标题:%@,%@",item.title,item.albumTitle);}return mediaQueue;}/*** 取得媒体集合** @return 媒体集合*/-(MPMediaItemCollection *)getLocalMediaItemCollection{MPMediaQuery *mediaQueue=[MPMediaQuery songsQuery];NSMutableArray *array=[NSMutableArray array];for (MPMediaItem *item in mediaQueue.items) {[array addObject:item];NSLog(@"标题:%@,%@",item.title,item.albumTitle);}MPMediaItemCollection *mediaItemCollection=[[MPMediaItemCollection alloc]initWithItems:[array copy]];return mediaItemCollection;}#pragma mark - MPMediaPickerController代理方法//选择完成-(void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection{MPMediaItem *mediaItem=[mediaItemCollection.items firstObject];//第一个播放音乐//注意很多音乐信息如标题、专辑、表演者、封面、时长等信息都可以通过MPMediaItem的valueForKey:方法得到,但是从iOS7开始都有对应的属性可以直接访问// NSString *title= [mediaItem valueForKey:MPMediaItemPropertyAlbumTitle];// NSString *artist= [mediaItem valueForKey:MPMediaItemPropertyAlbumArtist];// MPMediaItemArtwork *artwork= [mediaItem valueForKey:MPMediaItemPropertyArtwork];//UIImage *image=[artwork imageWithSize:CGSizeMake(100, 100)];//专辑图片NSLog(@"标题:%@,表演者:%@,专辑:%@",mediaItem.title ,mediaItem.artist,mediaItem.albumTitle);[self.musicPlayer setQueueWithItemCollection:mediaItemCollection];[self dismissViewControllerAnimated:YES completion:nil];}//取消选择-(void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker{[self dismissViewControllerAnimated:YES completion:nil];}#pragma mark - 通知/*** 添加通知*/-(void)addNotification{NSNotificationCenter *notificationCenter=[NSNotificationCenter defaultCenter];[notificationCenter addObserver:self selector:@selector(playbackStateChange:) name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:self.musicPlayer];}/*** 播放状态改变通知** @param notification 通知对象*/-(void)playbackStateChange:(NSNotification *)notification{switch (self.musicPlayer.playbackState) {case MPMusicPlaybackStatePlaying:NSLog(@"正在播放...");break;case MPMusicPlaybackStatePaused:NSLog(@"播放暂停.");break;case MPMusicPlaybackStateStopped:NSLog(@"播放停止.");break;default:break;}}#pragma mark - UI事件- (IBAction)selectClick:(UIButton *)sender {[self presentViewController:self.mediaPicker animated:YES completion:nil];}- (IBAction)playClick:(UIButton *)sender {[self.musicPlayer play];}- (IBAction)puaseClick:(UIButton *)sender {[self.musicPlayer pause];}- (IBAction)stopClick:(UIButton *)sender {[self.musicPlayer stop];}- (IBAction)nextClick:(UIButton *)sender {[self.musicPlayer skipToNextItem];}- (IBAction)prevClick:(UIButton *)sender {[self.musicPlayer skipToPreviousItem];}@end

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。