Hoe speel ik meerdere audiobestanden op een rij met AVAudioPlayer?

Ik heb 5 nummers in mijn app die ik graag achter elkaar wil afspelen met AVAudioPlayer.

Zijn er voorbeelden hiervan? Hoe kan ik dit bereiken?

Elke voorbeeldcode zou zeer op prijs worden gesteld!

Bedankt!

9
Het is erg moeilijk om enige informatie hierover te vinden ...
toegevoegd de auteur dot, de bron

4 antwoord

AVQueuePlayer werkt voor deze situatie.

AVQueuePlayer is a subclass of AVPlayer you use to play a number of items in sequence.

13
toegevoegd
mooi beantwoord .. Dit is wat ik wilde ..
toegevoegd de auteur Akshatha Srinivas, de bron

In plaats van AVAudioPlayer kunt u AVQueuePlayer gebruiken die beter geschikt is voor dit gebruik, zoals voorgesteld door Ken. Hier is een beetje code die u kunt gebruiken:

@interface AVSound : NSObject 

@property (nonatomic, retain) AVQueuePlayer* queuePlayer;

- (void)addToPlaylist:(NSString*)pathForResource ofType:(NSString*)ofType;
- (void)playQueue;

@end

@implementation AVSound
- (void)addToPlaylist:(NSString*)pathForResource ofType:(NSString*)ofType
{
   //Path to the audio file
    NSString *path = [[NSBundle mainBundle] pathForResource:pathForResource ofType:ofType];

   //If we can access the file...
    if ([[NSFileManager defaultManager] fileExistsAtPath:path])
    {

        AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:path]];

        if (_queuePlayer == nil) {
            _queuePlayer = [[AVQueuePlayer alloc] initWithPlayerItem:item];
        }else{
            [_queuePlayer insertItem:item afterItem:nil];
        }
    }

}


- (void)playQueue
{
    [_queuePlayer play];
}
@end

Om het vervolgens te gebruiken: In uw interfacebestand:

@property (strong, nonatomic) AVSound *pageSound;

In uw implementatiebestand:

- (void)addAudio:(Book*)book pageNum:(int)pageNum
{

    NSString *soundFileEven = [NSString stringWithFormat:@"%02d", pageNum-1];
    NSString *soundPathEven = [NSString stringWithFormat:@"%@_%@", book.productId,     soundFileEven];
    NSString *soundFileOdd = [NSString stringWithFormat:@"%02d", pageNum];
    NSString *soundPathOdd = [NSString stringWithFormat:@"%@_%@", book.productId, soundFileOdd];

    if (_pageSound == nil) {
        _pageSound = [[AVSound alloc]init];
        _pageSound.player.volume = 0.5;
    }

    [_pageSound clearQueue];

    [_pageSound addToPlaylist:soundPathEven ofType:@"mp3"];
    [_pageSound addToPlaylist:soundPathOdd ofType:@"mp3"];
    [_pageSound playQueue];
}

HTH

9
toegevoegd

Maak voor elke song die je wilt maken een enkele AVPlayer .

NSURL *url = [NSURL URLWithString:pathToYourFile];
AVPlayer *audioPlayer = [[AVPlayer alloc] initWithURL:url];
[audioPlayer play];

U kunt een melding krijgen wanneer de speler eindigt. Controleer AVPlayerItemDidPlayToEndTimeNotification bij het instellen van de speler:

  audioPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone; 

  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(playerItemDidReachEnd:)
                                               name:AVPlayerItemDidPlayToEndTimeNotification
                                             object:[audioPlayer currentItem]];

dit voorkomt dat de speler aan het einde pauzeert.

in de melding:

- (void)playerItemDidReachEnd:(NSNotification *)notification
{
   //start your next song here
}

U kunt uw volgende nummer starten zodra u een melding ontvangt dat het huidige nummer is voltooid. Behoud een teller die persistent is in selector-aanroepen. Op die manier krijg je met een -teller% [liedjes tellen] een oneindige lus-afspeellijst :)

Vergeet niet de registratie ongedaan te maken bij het vrijgeven van de speler.

1
toegevoegd
ja dat zou je kunnen doen. De code die ik hierboven heb gezet is theoretisch. Het zou wel maar niet gegarandeerd kunnen worden. Maar het idee lijkt werkbaar ...
toegevoegd de auteur Srikar Appalaraju, de bron
wat doe ik in playerItemDidReachEnd? audioPlayer2 spelen? wat als ik 5 nummers heb?
toegevoegd de auteur dot, de bron

Helaas kan AVAudioPlayer maar één bestand afspelen. Om twee bestanden af ​​te spelen, moet je het eerste exemplaar van de AVAudioPlayer doden en het voor de tweede keer opnieuw maken (het kan worden gestart met - (id) initWithContentsOfURL: (NSURL *) url-fout: (NSError **) outError ). Het probleem met deze aanpak is dat er een kleine vertraging is tussen het moment waarop het eerste bestand wordt afgespeeld en het moment waarop het tweede bestand wordt afgespeeld. Als je van deze vertraging af wilt komen, moet je ingaan op Core Audio en bedenken een veel complexere oplossing.

1
toegevoegd
ik denk dat er een manier is. bekijk mijn antwoord. AVPlayer heeft een meldingskiezer die aangeeft wanneer een nummer dat momenteel wordt afgespeeld, is afgelopen. Op die manier kunnen we ons volgende nummer afspelen zodra de huidige is voltooid. Dat zou kunnen werken.
toegevoegd de auteur Srikar Appalaraju, de bron
Ik kan me niet voorstellen dat er een opvallende opening is wanneer ik een melding probeer te gebruiken, tenzij het audiobestand zelf witte ruis bevat of een lege ruis vertoont. Op die manier zou AVAudioPlayer nog steeds spelen, maar de gebruiker denkt dat er een kloof is. Nog steeds nieuwsgierig om te weten waarom dit zo is ...
toegevoegd de auteur Srikar Appalaraju, de bron
Ik heb eigenlijk een radio-app gemaakt voor de iPhone en iPad. Ik weet dat vanaf iOS 4.2 er nog steeds een vertraging was bij het afspelen van twee bestanden op een rij met behulp van AVAudioPlayer. Ik probeerde zelfs een aparte AVAudioPlayer voor te bereiden met de prepareToPlay -methode en de tweede begon te spelen zodra de eerste klaar was, maar er was nog steeds een kleine vertraging. Als je een kleine vertraging tussen de geluiden niet erg vindt, is het geen probleem, maar als je volledig continu wilt afspelen tussen de twee bestanden, denk ik niet dat AVAudioPlayer de juiste keuze is.
toegevoegd de auteur Michael Frederick, de bron
de opening komt van de AVAudioPlayer die klaar is om het audiobestand af te spelen
toegevoegd de auteur Michael Frederick, de bron