zoukankan      html  css  js  c++  java
  • 播放后台音频

    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

  • 相关阅读:
    拍照上传图片方向调整
    js 压缩上传图片
    js 各种循环语法
    本地Git仓库对照多个远程仓库
    nrm安装与配置使用
    面试常见问题
    NodeJs文件路径
    vscode添加智能提示(typings)
    前端常用的工具库
    DeepMask学习笔记
  • 原文地址:https://www.cnblogs.com/fengmin/p/5527888.html
Copyright © 2011-2022 走看看