English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Explication de l'utilisation de l'iPhone Music Player DOUAudioStreamer

Il a longtemps que je n'ai pas écrit quelque chose, ces derniers temps, les heures supplémentaires sont trop sévères, aujourd'hui, je me suis dévoué à organiser le lecteur de musique DOUAudioStreamer utilisé, car le projet utilisait auparavant AVPlayer, ce qui est également acceptable, mais il faut d'abord un certain temps pour le cache avant de pouvoir lire, après que le patron ait regardé, il a exigé que le cache soit joué (quand il y a des connexions Internet, appuyez sur le bouton de lecture pour lire immédiatement), pourquoi ne pas l'avoir dit plus tôt ! pourquoi ne pas l'avoir dit plus tôt ! pourquoi ne pas l'avoir dit plus tôt ! Comment peut-on faire d'autre chose ? Il ne peut que l'excuser et continuer à écrire du code.... ...(allons directement à la code)

Première partie : Importation de bibliothèque tierce

pod 'DOUAudioStreamer'

ou adresse de téléchargement GitHup :https://github.com/douban/DOUAudioStreamer

Deuxième partie : Utilisation

1.Obtenez le fichier NAKPlaybackIndicatorView et les fichiers MusicIndicator.h et MusicIndicator.m du demo, puis importez les en-têtes

//Lecture musicale
#import "DOUAudioStreamer.h"
#import "NAKPlaybackIndicatorView.h"
#import "MusicIndicator.h"
#import "Track.h"

Comme illustré :

2.Créez une classe Track pour stocker l'URL de lecture musicale

3.Ajoutez DOUAudioStreamer dans l'interface.h nécessaire et utilisez le singleton pour l'initialiser

+ (instancetype)sharedInstance ;
@property (nonatomic, strong) DOUAudioStreamer *streamer;

 

Comme illustré :

En implementation de .m :

static void *kStatusKVOKey = &kStatusKVOKey;
static void *kDurationKVOKey = &kDurationKVOKey;
static void *kBufferingRatioKVOKey = &kBufferingRatioKVOKey;
@property (strong, nonatomic) MusicIndicator *musicIndicator;
@property (nonatomic, strong) Track *audioTrack;
+ (instancetype)sharedInstance {
 static HYNEntertainmentController *_sharedMusicVC = nil;
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
  _sharedMusicVC = [[HYNEntertainmentController alloc] init];
  _sharedMusicVC.streamer = [[DOUAudioStreamer alloc] init];
 }); 
 return _sharedMusicVC;
}

 

Événement du bouton de lecture

#pragma mark ---Bouton de lecture musicale
-(void)playMusicStart:(UIButton *)sender
{
  //Obtenir la cellule via le bouton
  MusicCollectionViewCell *musicCell = (MusicCollectionViewCell *)[[sender superview] superview];
 if(_playFirst == 0){//_playFirst == 0 pour la première lecture, autres pour la pause
  NSURL *_audioTrack.audioFileURL = url;
  @try {
  [self removeStreamerObserver];
   @catch(id anException){
  } 
  }
  //Il est nécessaire de le mettre à nil avant de jouer avec DOUAudioStreamer
  _streamer = nil;
  _streamer = [DOUAudioStreamer streamerWithAudioFile:_audioTrack];
  [self addStreamerObserver];
  [_streamer play];
 }
 if([_streamer status] == DOUAudioStreamerPaused ||
  if([_streamer status] == DOUAudioStreamerIdle){
  [sender setBackgroundImage:[UIImage imageNamed:@"music_play_icon"] forState:UIControlStateNormal];
  [_streamer play]; 
 }
  [sender setBackgroundImage:[UIImage imageNamed:@"music_stop_icon"] forState:UIControlStateNormal];
  [_streamer pause]; 
 }
 _playFirst++;
}

 

Pour ajouter un observateur

- (void)addStreamerObserver {
 [_streamer addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:kStatusKVOKey];
 [_streamer addObserver:self forKeyPath:@"duration" options:NSKeyValueObservingOptionNew context:kDurationKVOKey];
 [_streamer addObserver:self forKeyPath:@"bufferingRatio" options:NSKeyValueObservingOptionNew context:kBufferingRatioKVOKey]; 
}
/// 播放器销毁
- (void)dealloc{
 if (_streamer !=nil) {
  [_streamer pause];
  [_streamer removeObserver:self forKeyPath:@"status" context:kStatusKVOKey];
  [_streamer removeObserver:self forKeyPath:@"duration" context:kDurationKVOKey];
  [_streamer removeObserver:self forKeyPath:@"bufferingRatio" context:kBufferingRatioKVOKey];
  _streamer =nil;
 } 
}
- (void)removeStreamerObserver {
 [_streamer removeObserver:self forKeyPath:@"status"];
 [_streamer removeObserver:self forKeyPath:@"duration"];
 [_streamer removeObserver:self forKeyPath:@"bufferingRatio"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
 if (context == kStatusKVOKey) {
  [self performSelector:@selector(updateStatus)]
      onThread:[NSThread mainThread]
     withObject:nil
    waitUntilDone:NO];
 } else if (context == kDurationKVOKey) {
  [self performSelector:@selector(updateSliderValue:)
      onThread:[NSThread mainThread]
     withObject:nil
    waitUntilDone:NO];
 } else if (context == kBufferingRatioKVOKey) {
  [self performSelector:@selector(updateBufferingStatus)
      onThread:[NSThread mainThread]
     withObject:nil
    waitUntilDone:NO];
 } else {
  [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
 }
}
- (void)updateSliderValue:(id)timer {
}
-(void)updateBufferingStatus
{ 
}
- (void)updateStatus {
 //self.musicIsPlaying = NO;
 _musicIndicator.state = NAKPlaybackIndicatorViewStateStopped;
 switch ([_streamer status]) {
  case DOUAudioStreamerPlaying:
   // self.musicIsPlaying = YES;
   _musicIndicator.state = NAKPlaybackIndicatorViewStatePlaying;
   break;
  case DOUAudioStreamerPaused:
   break;
  case DOUAudioStreamerIdle:
   break;
  case DOUAudioStreamerFinished:
   break;
  case DOUAudioStreamerBuffering:
   _musicIndicator.state = NAKPlaybackIndicatorViewStatePlaying;
   break;  
  case DOUAudioStreamerError:
   break;
 } 
}

Ainsi, la lecture peut commencer.

Affichage de la musique lors du verrouillage de l'écran, arrêt de lecture après le retrait des écouteurs, écoute des événements de perturbation audio

-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//accepter le contrôle à distance
[self becomeFirstResponder];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
}
//ne pas oublier cela
-(BOOL)canBecomeFirstResponder{
retourner YES;
}
- (void)viewDidLoad {
[super viewDidLoad];
//lecteur de musique
[self initPlayer];
}
#pragma mark =========================Musique de lecture==============================
//lecteur de musique
-(void)initPlayer
{
_audioTrack = [[Track alloc] init];
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
//permettre à l'application de recevoir des événements de contrôle à distance
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//ajouter des notifications, arrêter de jouer après avoir retiré l'écouteur
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(routeChange:) name:AVAudioSessionRouteChangeNotification object:nil];
// écouter les événements de perturbation audio
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionWasInterrupted:) name:AVAudioSessionInterruptionNotification object:session];
}
// écouter les événements de perturbation audio
- (void)audioSessionWasInterrupted:(NSNotification *)notification
{
 //quand il est interrompu
if (AVAudioSessionInterruptionTypeBegan == [notification.userInfo[AVAudioSessionInterruptionTypeKey] intValue])
{
[_streamer pause];
UIButton *btn = (UIButton *)[self.view viewWithTag:2000];
[btn setBackgroundColor:[UIImage imageNamed:@"music_stop_icon"] forState:UIControlStateNormal];
}
sinon si (AVAudioSessionInterruptionTypeEnded == [notification.userInfo[AVAudioSessionInterruptionTypeKey] intValue])]}
{
}
}
// Arrêter la lecture après l'insertion des écouteurs
-(void)routeChange:(NSNotification *)notification{
NSDictionary *dic=notification.userInfo;
int changeReason= [dic[AVAudioSessionRouteChangeReasonKey] intValue];
//Égal à AVAudioSessionRouteChangeReasonOldDeviceUnavailable signifie que l'ancienne sortie n'est plus disponible
si (changeReason==AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {
AVAudioSessionRouteDescription *routeDescription=dic[AVAudioSessionRouteChangePreviousRouteKey];
AVAudioSessionPortDescription *portDescription= [routeDescription.outputs firstObject];
//L'appareil d'origine est un casque, il faut arrêter
si ([portDescription.portType isEqualToString:@"Headphones"]) {
[_streamer pause];
UIButton *btn = (UIButton *)[self.view viewWithTag:2000];
[btn setBackgroundColor:[UIImage imageNamed:@"music_stop_icon"] forState:UIControlStateNormal];
}
}
}
//Affichage de la musique lors du verrouillage de l'écran (Cette méthode peut être appelée lors d'un clic sur lecture pour transmettre des valeurs)
- (void)configurerLesInfoDuVerrouillageDcranAvecSing:(NSString *)sign WithSigner:(NSString *)signer WithImage:(UIImage *)image
{
// 1.obtenir le centre de verrouillage d'écran
MPNowPlayingInfoCenter *playingInfoCenter = [MPNowPlayingInfoCenter defaultCenter];
//Initialize a dictionary to store music information
NSMutableDictionary *playingInfoDict = [NSMutableDictionary dictionary];
// 2Set the song name
if (sign) {
[playingInfoDict setObject:sign forKey:MPMediaItemPropertyAlbumTitle];
}
// Set the artist name
if (signer) {
[playingInfoDict setObject:signer forKey:MPMediaItemPropertyArtist];
}
// 3Set the cover image
//UIImage *image = [self getMusicImageWithMusicId:self.currentModel];
if (image) {
MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc] initWithImage:image];
[playingInfoDict setObject:artwork forKey:MPMediaItemPropertyArtwork];
}
// 4Set the total duration of the song
//[playingInfoDict setObject:self.currentModel.detailDuration forKey:MPMediaItemPropertyPlaybackDuration];
//Assign music information to the nowPlayingInfo property of the lock screen center
playingInfoCenter.nowPlayingInfo = playingInfoDict;
// 5.Enable remote interaction
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
}
//lock screen operation
- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent {
if (receivedEvent.type == UIEventTypeRemoteControl) {
UIButton *sender = (UIButton *)[self.view viewWithTag:2000];
switch (receivedEvent.subtype) {//Vérifier si c'est un contrôle à distance
case UIEventSubtypeRemoteControlPause:
[[HYNEntertainmentController sharedInstance].streamer pause];
[sender setBackgroundImage:[UIImage imageNamed:@"music_stop_icon"] forState:UIControlStateNormal];
break;
case UIEventSubtypeRemoteControlStop:
break;
case UIEventSubtypeRemoteControlPlay:
[[HYNEntertainmentController sharedInstance].streamer play];
[sender setBackgroundImage:[UIImage imageNamed:@"music_play_icon"] forState:UIControlStateNormal];
break;
case UIEventSubtypeRemoteControlTogglePlayPause:
break;
case UIEventSubtypeRemoteControlNextTrack:
break;
case UIEventSubtypeRemoteControlPreviousTrack:
break;
default:
break;
}
}
}

Image globale :

L'image ci-dessus montre qu'il n'est pas en lecture

L'image ci-dessus montre qu'il est en lecture

L'image ci-dessus montre l'état de verrouillage

Il ne devrait pas y avoir grand-chose à ajouter pour le moment, prenez une pause temporaire. Si vous avez des suggestions, vous pouvez les discuter dans la zone de commentaires ci-dessous. Merci de votre soutien à l'enseignement à cri

Vous pourriez aussi aimer