博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
播放后台音频
阅读量:7115 次
发布时间:2019-06-28

本文共 8867 字,大约阅读时间需要 29 分钟。

1、申明后台模式播放

1 #import 
2 #import
3 #import
4 5 @interface ViewController : UIViewController
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)canBecomeFirstResponder118 {119     return YES;120 }121 122 - (void)playerItemDidReachEnd:(NSNotification *)notification123 {124     [self goToNextTrack:self];125 }126 127 -(AVPlayerItem *)avItemFromMPItem:(MPMediaItem *)mpItem128 {129     NSURL *url = [mpItem valueForProperty:MPMediaItemPropertyAssetURL];130 131     AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];132 133     [[NSNotificationCenter defaultCenter]134      addObserver:self135      selector:@selector(playerItemDidReachEnd:)136      name:AVPlayerItemDidPlayToEndTimeNotification137      object:item];138 139     return item;140 }141 142 -(void)startPlayback143 {144     [self.player play];145     [self.playButton setTitle:@"Pause" forState:UIControlStateNormal];146     [self updateNowPlaying];147 }148 149 -(void)startPlaybackWithItem:(MPMediaItem *)mpItem150 {151     [self.player replaceCurrentItemWithPlayerItem:[self avItemFromMPItem:mpItem]];152     [self.player seekToTime:kCMTimeZero];153     [self startPlayback];154 }155 156 -(void)pausePlayback157 {158     [self.player pause];159     [self.playButton setTitle:@"Play" forState:UIControlStateNormal];160 }161 162 - (IBAction)togglePlay:(id)sender163 {164     if (self.playlist.count > 0)165     {166         if (self.player.currentItem == nil)167         {168             [self startPlaybackWithItem:[self.playlist objectAtIndex:0]];169         }170         else171         {172             // Player has an item, pause or resume playing it173             BOOL isPlaying = self.player.currentItem && self.player.rate != 0;174             if (isPlaying)175             {176                 [self pausePlayback];177             }178             else179             {180                 [self startPlayback];181             }182         }183     }184 }185 186 - (IBAction)queueFromLibrary:(id)sender187 {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)sender196 {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 *)mediaPicker204 {205     [self dismissViewControllerAnimated:YES completion:NULL];206 }207 208 -(void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection209 {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)sender221 {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     else230     {231         if (self.currentIndex == 0)232         {233             self.currentIndex = self.playlist.count - 1;234         }235         else236         {237             self.currentIndex -= 1;238         }239         MPMediaItem *previousItem = [self.playlist objectAtIndex:self.currentIndex];240         [self startPlaybackWithItem:previousItem];241     }242 }243 244 - (IBAction)goToNextTrack:(id)sender245 {246     if (self.playlist.count == 0)247         return;248     249     if (self.currentIndex == self.playlist.count - 1)250     {251         self.currentIndex = 0;252     }253     else254     {255         self.currentIndex += 1;256     }257     MPMediaItem *nextItem = [self.playlist objectAtIndex:self.currentIndex];258     [self startPlaybackWithItem: nextItem];259 }260 261 262 @end

转载地址:http://seghl.baihongyu.com/

你可能感兴趣的文章
js获取下拉框的value值
查看>>
LeetCode OJ:Permutations(排列)
查看>>
云科技时代:阿里云创造者写了《在线》,这是一本怎样的书?
查看>>
PyQt5:常用控件
查看>>
WordPress部署踩坑记
查看>>
sublime-snippets 插件编写
查看>>
代码规范
查看>>
Leetcode | Length of Last Word
查看>>
2017.4.16关于在线图书商城注册界面总结
查看>>
HTML基础
查看>>
MyBatis初探
查看>>
线程和进程的区别
查看>>
[POI2008]Station
查看>>
王昆扬老师发来的材料:关于实数的构造
查看>>
[转] Javascript继承机制的设计思想
查看>>
夜间模式的开启与关闭,父模板的制作
查看>>
ffmpeg为视频添加时间戳 - 手动编译ffmpeg
查看>>
C# ABP 配置连接数据库&创建表
查看>>
1189:Pell数列
查看>>
求水缸深度-深信服2019春招
查看>>