AVQueuePlayer/AVPlayer laadkennisgeving?

Ik heb een AVQueuePlayer (die uiteraard AVPlayer uitbreidt) die een afspeellijst met streaming audio laadt. Streamen werkt allemaal prima, maar ik wil graag een activiteitsindicator hebben om aan te geven dat de audio van de gebruiker wordt geladen. Het probleem is dat ik niet zo'n melding in AVQueuePlayer (of AVPlayer ) kan vinden die aangeeft wanneer de audiobuffer is geladen/klaar is om te spelen (noch lijkt er een gedelegeerde methode te zijn). Wat denk jij?

7

1 antwoord

Je zult KVO moeten gebruiken om dit voor elkaar te krijgen.

Voor elk item dat u aan de wachtrij toevoegt, kunt u waarnemers als volgt instellen:

item_ = [[AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://somefunkyurl"]] retain];
[item_ addObserver:self forKeyPath:@"status" options:0 context:nil];
[item_ addObserver:self forKeyPath:@"playbackBufferEmpty" options:0 context:nil];

Nu kunt u de status van dat item evalueren binnen de waarnemersmethode;

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([object isKindOfClass:[AVPlayerItem class]])
    {
        AVPlayerItem *item = (AVPlayerItem *)object;
        //playerItem status value changed?
        if ([keyPath isEqualToString:@"status"])
        {   //yes->check it...
            switch(item.status)
            {
                case AVPlayerItemStatusFailed:
                    NSLog(@"player item status failed");
                break;
                case AVPlayerItemStatusReadyToPlay:
                    NSLog(@"player item status is ready to play");
                break;
                case AVPlayerItemStatusUnknown:
                    NSLog(@"player item status is unknown");
                break;
            }
        }
        else if ([keyPath isEqualToString:@"playbackBufferEmpty"])
        {
            if (item.playbackBufferEmpty)
            {
                NSLog(@"player item playback buffer is empty");
            }
        }
    }
}
26
toegevoegd
Kleine opmerking: u moet de context gebruiken om te bepalen hoe een KVO-melding moet worden afgehandeld! Het maakt waarschijnlijk niet uit of je NSObject wilt subclasseren, maar zodra je iets iets geavanceerder dan dat subclassiseert, kan het niet doorsturen van observeValueForKeyPath: ... leiden tot de meest eigenaardige bijwerkingen.
toegevoegd de auteur danyowdee, de bron
De beste manier om deze waarnemer te verwijderen?
toegevoegd de auteur jose920405, de bron
@virorum Goed punt, voegde dat toe aan mijn antwoord - ty!
toegevoegd de auteur Till, de bron
@virorum mea culpa, mea culpa, mea maxima culpa: D ... opgelost dat ...
toegevoegd de auteur Till, de bron
@danyowdee je hebt gelijk - dit is echt alleen maar ter wille van dit voorbeeld. Ik zal nooit het sleutelpad gebruiken om te controleren of mijn waarnemer wordt aangeroepen voor een evenement dat ik eigenlijk wil registreren. Het gebruik van de context is zeker sneller en betrouwbaarder.
toegevoegd de auteur Till, de bron
@ZaidPathan moet je beginnen met animeren in het begin en wanneer je een playbackBufferEmpty hebt en stop met animeren zodra je een status verandering krijgt.
toegevoegd de auteur Till, de bron
@Till, wanneer moeten we stoppen met het analyseren van onze activiteitsindicator?
toegevoegd de auteur Zaid Pathan, de bron
@reddersky/Totdat de buffer leeg is, kunt u ook de melding AVPlayerItemPlaybackStalledNotification gebruiken
toegevoegd de auteur Gabriel.Massana, de bron
U kunt ook de eigenschap playbackBufferEmpty van de AVPlayerItem-objecten observeren om te detecteren of/wanneer uw buffer tijdens het afspelen leeg raakt, zodat u een activiteitsindicator of 'buffering'-waarschuwing kunt weergeven.
toegevoegd de auteur reddersky, de bron
Je zou altijd mijn commentaar kunnen geven als je het leuk vond ;-)
toegevoegd de auteur reddersky, de bron