web-dev-qa-db-fra.com

Lecture de musique en arrière-plan à l'aide d'AVAudioplayer

Je veux jouer de la musique même si l'application passe en arrière-plan. J'ai vérifié tous les liens stackoverflow mais aucun d'eux n'a fonctionné. Veuillez aider à le faire aujourd'hui.

J'avais utilisé le code suivant: -

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Day At The Beach"  ofType: @"mp3"];

NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];

NSError *error;
playerTemp = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
playerTemp.numberOfLoops = 0;
AudioSessionSetActive(true);
[playerTemp play];
38
leena

J'avais résolu cette question en me référant tâches d'arrière-plan de l'application iOS

et apportez quelques modifications dans .plist fichier de notre application ..

Mise à jour

écrire ce code dans la vue de votre contrôleur a fait une méthode de chargement comme celle-ci

- (void)viewDidLoad
{
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"in-the-storm" ofType:@"mp3"]];
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    [[AVAudioSession sharedInstance] setActive: YES error: nil];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [audioPlayer play];
    [super viewDidLoad];
}
79
Mehul Mistri

Je voulais juste ajouter une note à la réponse de Mehul. Cette ligne:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

est en fait très important. J'ai utilisé d'autres tutoriels pour mettre mon AVAudioPlayer en service. Tout a bien fonctionné, sauf que mon audio ne démarrerait pas si l'application était en arrière-plan. Pour clarifier, mon audio était bien s'il était déjà en cours de lecture lorsque l'application était en arrière-plan ... mais il ne démarrerait pas si l'application était déjà en arrière-plan.

L'ajout de la ligne de code ci-dessus a permis à mon audio de démarrer même si l'application était en arrière-plan.

32
ghostatron

Vous devez définir "audio" comme l'un de vos UIBackgroundModes dans Info.plist. Apple a documentation sur le problème .

6
Alastair Stuart

Écrivez cette ligne pour plist pour l'exécution en arrière-plan ...

<key>UIBackgroundModes</key>
      <array>
              <string>audio</string>
      </array>

Écrivez ce code Où vous voulez utiliser

AVAudioPlayer*  audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.urlForConevW error:&error];
audioPlayer.delegate = self;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
audioPlayer.numberOfLoops =  1;       
[audioPlayer play];
4
sankalp

Aussi important ici si vous utilisez MPMusicPlayerController: Vous devez utiliser:

[MPMusicPlayerController iPodMusicPlayer] 

Et pas

[MPMusicPlayerController applicationMusicPlayer] 

De plus, si vous ne souhaitez pas que votre application stop music qui était en cours de lecture au démarrage de votre application, regardez ici: AVAudioPlayer désactive l'iPod - comment contourner?

3
Andy Weinstein

Étape 1

Apportez les modifications suivantes dans info.plist

  1. L'application ne s'exécute pas en arrière-plan: NON

  2. Modes d'arrière-plan requis

    item0 :App plays audio or streams audio/video using AirPlay

Étape 2 N'oubliez pas d'ajouter les éléments suivants dans MainViewController.h fichier

  1. #import <'AVFoundation/AVAudioPlayer.h>
  2. @interface MainViewController:<'AVAudioPlayerDelegate>

  3. AVAudioPlayer *H_audio_player;

Étape Ajoutez le code suivant dans la action de lecture de votre classe MainViewController.

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d-%d",C_CID, C_SID] ofType:@"mp3"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
H_audio_player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
H_audio_player.delegate = self;
H_audio_player.numberOfLoops = -1;
3
Juhi

Vous pouvez utiliser MPMoviePlayerController même pour lire des films audio en solo. Si vous l'aimez, lisez ceci Apple Q&A technique de la bibliothèque:

Q&A technique de la bibliothèque des développeurs iOS QA1668

3
viggio24

Si même après avoir défini l'audio comme l'un de vos UIBackgroundModes dans la liste, l'audio s'arrête lorsque vous passez en arrière-plan, essayez setting votre application's audio session à media playback.

Voici la référence associée: https://developer.Apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Introduction/Introduction.html

Voici à quoi ressemblera le code:

NSError *activationError = nil;
[[AVAudioSession sharedInstance] setActive: YES error: &activationError];

NSError*setCategoryError = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];
2
Zaky German

J'utilise le code ci-dessous. Cela fonctionne pour moi et appelle le clic du bouton de la méthode d'instance du lecteur audio.

NSError *error; NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"]]; 
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
[[AVAudioSession sharedInstance] setActive:YES error: &error]; 
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self.player prepareToPlay];
2
user2168844

De toutes les réponses, il manque ce code pour contrôler le lecteur lorsque l'utilisateur réveille l'appareil:

- (BOOL)canBecomeFirstResponder {
        return YES;
    }

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
    switch (event.subtype) {

        case UIEventSubtypeRemoteControlPlay:

            [_audioPlayer play];
            break;

        case UIEventSubtypeRemoteControlPause:

            [_audioPlayer pause];
            break;

        default:
            break;
    }
}

Et vous avez toutes ces options:

UIEventSubtypeRemoteControlPlay                 = 100,
UIEventSubtypeRemoteControlPause                = 101,
UIEventSubtypeRemoteControlStop                 = 102,
UIEventSubtypeRemoteControlTogglePlayPause      = 103,
UIEventSubtypeRemoteControlNextTrack            = 104,
UIEventSubtypeRemoteControlPreviousTrack        = 105,
UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
UIEventSubtypeRemoteControlEndSeekingBackward   = 107,
UIEventSubtypeRemoteControlBeginSeekingForward  = 108,
UIEventSubtypeRemoteControlEndSeekingForward    = 109,
2
Winston

Pour lire votre audio en arrière-plan

Étape 1: Ajoutez simplement votre info.plist créez un tableau enter image description here

étape 2 :

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    __block UIBackgroundTaskIdentifier task = 0;
    task=[application beginBackgroundTaskWithExpirationHandler:^{
        NSLog(@"Expiration handler called %f",[application backgroundTimeRemaining]);
        [application endBackgroundTask:task];
        task=UIBackgroundTaskInvalid;
    }];
}

étape 3 :

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"iNamokar" ofType:@"mp3"];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];

    AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    [[AVAudioSession sharedInstance] setActive: YES error: nil];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[player prepareToPlay];
[self.player play];
1
Kanhaiya Sharma

À partir de l'exemple de code d'Apple: Audio Mixer (MixerHost)

// If using a nonmixable audio session category, as this app does, you must activate reception of 
//    remote-control events to allow reactivation of the audio session when running in the background.
//    Also, to receive remote-control events, the app must be eligible to become the first responder.
- (void) viewDidAppear: (BOOL) animated {

    [super viewDidAppear: animated];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];
}

Je pense que les événements de contrôle à distance ne sont pas nécessaires dans le cas suivant:

AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers,
                        sizeof(value), &value);
0
Gamma-Point