web-dev-qa-db-fra.com

Streaming audio mp3 avec AVPlayer

J'entends des rapports contradictoires à ce sujet. Ce que j'essaie de faire est de diffuser un fichier mp3 à partir d'une URL. J'ai fait des heures de recherche, mais je ne trouve aucun bon guide sur la manière de procéder, ni même le type de lecteur audio à utiliser. 

Certains amis me disent qu'AVPlayer peut diffuser du mp3, mais la documentation d'Apple dit qu'il ne le peut pas. J'ai parcouru le streamer audio de Matt Gallagher (http://www.cocoawithlove.com/2008/09/streaming-and-playing-live-mp3-stream.html), mais ce code a été créé il y a longtemps, Je suis assez nouveau dans ce domaine pour qu'il soit difficile de travailler avec les autoreleases, les retenues et tout le reste.

L’audio que j’essaie de diffuser est un fichier MP3 assez volumineux provenant d’un serveur libsyn, avec une URL de format ..

http://traffic.libsyn.com/podcastname/episode.mp3

Tout ce que j'ai à faire est de le saisir et de commencer à jouer, avec la possibilité de faire une pause et de frotter. Donc, tout d’abord, CAN AVPlayer peut-il diffuser des mp3? Et si oui, est-ce que quelqu'un a des guides ou un code sur lequel il peut m'indiquer? Et si non, existe-t-il une classe de lecteur audio capable de diffuser de l'audio? 

J'ai essayé de créer un AVPlayerItem, initialisé avec l'URL, puis de l'ajouter à un AVPlayer, mais je reçois une tonne d'erreurs Chargement en cours ... et Symbole non trouvé .... J'apprécierais toute information à ce sujet, merci!

24
derekahc

essaye ça

 -(void)playselectedsong{

        AVPlayer *player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:urlString]];
        self.songPlayer = player;
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(playerItemDidReachEnd:)
                                                     name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:[songPlayer currentItem]];
        [self.songPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
        [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateProgress:) userInfo:nil repeats:YES];



    }
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

        if (object == songPlayer && [keyPath isEqualToString:@"status"]) {
            if (songPlayer.status == AVPlayerStatusFailed) {
                NSLog(@"AVPlayer Failed");

            } else if (songPlayer.status == AVPlayerStatusReadyToPlay) {
                NSLog(@"AVPlayerStatusReadyToPlay");
                [self.songPlayer play];


            } else if (songPlayer.status == AVPlayerItemStatusUnknown) {
                NSLog(@"AVPlayer Unknown");

            }
        }
    }

    - (void)playerItemDidReachEnd:(NSNotification *)notification {

     //  code here to play next sound file

    }
65
Sumit Mundra

Vous pouvez également essayer ma librairie open source Audjustable qui prend en charge le streaming HTTP. Il est basé sur AudioStreamer de Matt, mais a été rangé, optimisé et mis à jour pour prendre en charge plusieurs sources de données (non HTTP) et la lecture sans intervalle.

https://github.com/tumtumtum/audjustable .

14
tumtumtum

En plus de la réponse de Sumit Mundra, qui m'a beaucoup aidé, j'ai constaté que cette technique ne permet pas de diffuser des fichiers MP3 à partir d'un serveur distant. Lorsque j'ai implémenté cela, le fichier téléchargé de manière synchrone, bloquant mon interface utilisateur, avant de jouer. Le moyen de diffuser correctement le MP3 qui, à mon avis, fonctionnait très bien était de pointer vers un fichier M3U. Ceci est juste un fichier texte avec une extension .m3u qui contient un lien vers le MP3 original. Pointez le code de Sumit sur ce fichier à la place et vous obtenez un flux qui commence à jouer immédiatement.

C'est l'endroit où j'ai trouvé cette information: http://www.soundabout.net/streammp3.htm

2
Aaron Vegh

AudioStreamer de Matt Gallagher a été mis à jour il y a 2 mois https://github.com/mattgallagher/AudioStreamer/commits/master

Mais pour ce que vous cherchez, consultez l'exemple de code StichedStreamPlayer http://developer.Apple.com/library/ios/#samplecode/StitchedStreamPlayer/Introduction/Intro.html#Apple_ref/doc/uid/DTS40010092

Il utilise un objet AVPlayer et si vous examinez l'expéditeur de la méthode - (IBAction) loadMovieButtonPressed: (id), vous devriez pouvoir suivre la façon dont il configure l'objet AVPlayer.

0
Iain Smith