播放后台音频

1、申明后台模式播放

 1 #import <UIKit/UIKit.h>
 2 #import <AVFoundation/AVFoundation.h>
 3 #import <MediaPlayer/MediaPlayer.h>
 4 
 5 @interface ViewController : UIViewController<MPMediaPickerControllerDelegate>
 6 
 7 @property (weak, nonatomic) IBOutlet UIButton *playButton;
 8 @property (weak, nonatomic) IBOutlet UILabel *infoLabel;
 9 @property (weak, nonatomic) IBOutlet UIImageView *artworkImageView;
10 @property (nonatomic, strong) AVAudioSession *session;
11 @property (nonatomic, strong) AVPlayer *player;
12 @property (nonatomic, strong) NSMutableArray *playlist;
13 @property (nonatomic)NSInteger currentIndex;
14 
15 - (IBAction)goToPrevTrack:(id)sender;
16 - (IBAction)goToNextTrack:(id)sender;
17 - (IBAction)togglePlay:(id)sender;
18 - (IBAction)queueFromLibrary:(id)sender;
19 - (IBAction)clearPlaylist:(id)sender;
20 
21 @end
  1 #import "ViewController.h"
  2 
  3 @interface ViewController ()
  4 
  5 @end
  6 
  7 @implementation ViewController
  8 @synthesize playButton;
  9 @synthesize infoLabel;
 10 @synthesize artworkImageView;
 11 
 12 - (void)viewDidLoad
 13 {
 14     [super viewDidLoad];
 15 
 16     self.session = [AVAudioSession sharedInstance];
 17     NSError *error;
 18     //申明后台模式播放
 19     [self.session setCategory:AVAudioSessionCategoryPlayback error:&error];
 20     if (error)
 21     {
 22         NSLog(@"Error setting audio session category: %@", error);
 23     }
 24     [self.session setActive:YES error:&error];
 25     if (error)
 26     {
 27         NSLog(@"Error activating audio session: %@", error);
 28     }
 29     
 30     self.playlist = [[NSMutableArray alloc] init];
 31     self.player = [[AVPlayer alloc] init];
 32 }
 33 
 34 - (void)didReceiveMemoryWarning
 35 {
 36     [super didReceiveMemoryWarning];
 37     // Dispose of any resources that can be recreated.
 38 }
 39 
 40 -(void)updateNowPlaying
 41 {
 42     if (self.player.currentItem != nil)
 43     {
 44         MPMediaItem *currentMPItem = [self.playlist objectAtIndex:self.currentIndex];
 45         
 46         self.infoLabel.text = [NSString stringWithFormat:@"%@ - %@", [currentMPItem valueForProperty:MPMediaItemPropertyTitle],  [currentMPItem valueForProperty:MPMediaItemPropertyArtist]];
 47         
 48         UIImage *artwork = [[currentMPItem valueForProperty:MPMediaItemPropertyArtwork] imageWithSize:self.artworkImageView.frame.size];
 49         self.artworkImageView.image = artwork;
 50         
 51         if ([MPNowPlayingInfoCenter class])
 52         {
 53             NSString *title = [currentMPItem valueForProperty:MPMediaItemPropertyTitle];
 54             NSString *artist = [currentMPItem valueForProperty:MPMediaItemPropertyArtist];
 55             NSString *album = [currentMPItem valueForProperty:MPMediaItemPropertyAlbumTitle];
 56             
 57             NSDictionary *mediaInfo = [NSDictionary dictionaryWithObjectsAndKeys:
 58                                        artist, MPMediaItemPropertyArtist,
 59                                        title, MPMediaItemPropertyTitle,
 60                                        album, MPMediaItemPropertyAlbumTitle,
 61                                        [currentMPItem valueForProperty:MPMediaItemPropertyArtwork], MPMediaItemPropertyArtwork,
 62                                        nil];
 63             [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = mediaInfo;
 64         }
 65     }
 66     else
 67     {
 68         self.infoLabel.text = @"...";
 69         [self.playButton setTitle:@"Play" forState:UIControlStateNormal];
 70         self.artworkImageView.image = nil;
 71     }
 72 }
 73 
 74 
 75 - (void)viewDidAppear:(BOOL)animated
 76 {
 77     [super viewDidAppear:animated];
 78     //注册远程控制事件
 79     [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
 80     [self becomeFirstResponder];
 81 }
 82 
 83 - (void)viewWillDisappear:(BOOL)animated
 84 {
 85     [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
 86     [self resignFirstResponder];
 87     [super viewWillDisappear:animated];
 88 }
 89 //接收和响应远程控制事件
 90 - (void)remoteControlReceivedWithEvent: (UIEvent *) receivedEvent
 91 {
 92     if (receivedEvent.type == UIEventTypeRemoteControl)
 93     {
 94         switch (receivedEvent.subtype)
 95         {
 96             //调用各自的动作方法实现事件的定向
 97             case UIEventSubtypeRemoteControlTogglePlayPause:
 98                 [self togglePlay:self];
 99                 break;
100                 
101             case UIEventSubtypeRemoteControlPreviousTrack:
102                 [self goToPrevTrack:self];
103                 break;
104                 
105             case UIEventSubtypeRemoteControlNextTrack:
106                 [self goToNextTrack:self];
107                 break;
108                 
109             default:
110                 break;
111         }
112     }
113 }
114 
115 
116 //使用户能够远程控制媒体播放器,通过耳机或者活动栏。
117 -(BOOL)canBecomeFirstResponder
118 {
119     return YES;
120 }
121 
122 - (void)playerItemDidReachEnd:(NSNotification *)notification
123 {
124     [self goToNextTrack:self];
125 }
126 
127 -(AVPlayerItem *)avItemFromMPItem:(MPMediaItem *)mpItem
128 {
129     NSURL *url = [mpItem valueForProperty:MPMediaItemPropertyAssetURL];
130 
131     AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];
132 
133     [[NSNotificationCenter defaultCenter]
134      addObserver:self
135      selector:@selector(playerItemDidReachEnd:)
136      name:AVPlayerItemDidPlayToEndTimeNotification
137      object:item];
138 
139     return item;
140 }
141 
142 -(void)startPlayback
143 {
144     [self.player play];
145     [self.playButton setTitle:@"Pause" forState:UIControlStateNormal];
146     [self updateNowPlaying];
147 }
148 
149 -(void)startPlaybackWithItem:(MPMediaItem *)mpItem
150 {
151     [self.player replaceCurrentItemWithPlayerItem:[self avItemFromMPItem:mpItem]];
152     [self.player seekToTime:kCMTimeZero];
153     [self startPlayback];
154 }
155 
156 -(void)pausePlayback
157 {
158     [self.player pause];
159     [self.playButton setTitle:@"Play" forState:UIControlStateNormal];
160 }
161 
162 - (IBAction)togglePlay:(id)sender
163 {
164     if (self.playlist.count > 0)
165     {
166         if (self.player.currentItem == nil)
167         {
168             [self startPlaybackWithItem:[self.playlist objectAtIndex:0]];
169         }
170         else
171         {
172             // Player has an item, pause or resume playing it
173             BOOL isPlaying = self.player.currentItem && self.player.rate != 0;
174             if (isPlaying)
175             {
176                 [self pausePlayback];
177             }
178             else
179             {
180                 [self startPlayback];
181             }
182         }
183     }
184 }
185 
186 - (IBAction)queueFromLibrary:(id)sender
187 {
188     MPMediaPickerController *picker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic];
189     picker.delegate = self;
190     picker.allowsPickingMultipleItems = YES;
191     picker.prompt = @"Choose Some Music!";
192     [self presentViewController:picker animated:YES completion:NULL];
193 }
194 
195 - (IBAction)clearPlaylist:(id)sender
196 {
197     [self.player replaceCurrentItemWithPlayerItem:nil];
198     [self.playlist removeAllObjects];
199     [self updateNowPlaying];
200     [self.playButton setTitle:@"Play" forState:UIControlStateNormal];
201 }
202 
203 -(void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker
204 {
205     [self dismissViewControllerAnimated:YES completion:NULL];
206 }
207 
208 -(void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
209 {
210     BOOL shallStartPlayer = self.playlist.count == 0;
211     
212     [self.playlist addObjectsFromArray:mediaItemCollection.items];
213     
214     if (shallStartPlayer)
215         [self startPlaybackWithItem:[self.playlist objectAtIndex:0]];
216 
217     [self dismissViewControllerAnimated:YES completion:NULL];
218 }
219 
220 - (IBAction)goToPrevTrack:(id)sender
221 {
222     if (self.playlist.count == 0)
223         return;
224     
225     if (CMTimeCompare(self.player.currentTime, CMTimeMake(5.0, 1)) > 0)
226     {
227         [self.player seekToTime:kCMTimeZero];
228     }
229     else
230     {
231         if (self.currentIndex == 0)
232         {
233             self.currentIndex = self.playlist.count - 1;
234         }
235         else
236         {
237             self.currentIndex -= 1;
238         }
239         MPMediaItem *previousItem = [self.playlist objectAtIndex:self.currentIndex];
240         [self startPlaybackWithItem:previousItem];
241     }
242 }
243 
244 - (IBAction)goToNextTrack:(id)sender
245 {
246     if (self.playlist.count == 0)
247         return;
248     
249     if (self.currentIndex == self.playlist.count - 1)
250     {
251         self.currentIndex = 0;
252     }
253     else
254     {
255         self.currentIndex += 1;
256     }
257     MPMediaItem *nextItem = [self.playlist objectAtIndex:self.currentIndex];
258     [self startPlaybackWithItem: nextItem];
259 }
260 
261 
262 @end

posted @ 2016-05-25 17:39  FMDN  阅读(496)  评论(0编辑  收藏  举报