AVPlayer HLS Live Stream Level Meter (FFT-Daten anzeigen)

Ich benutzeAVPlayer für eine Radio-App mit HTTP-Live-Streaming. Jetzt möchte ich eine Pegelanzeige für diesen Audiostream implementieren. Am besten wäre ein Pegelmesser, der die verschiedenen Frequenzen anzeigt, aber eine einfache Links / Rechts-Lösung wäre ein guter Ausgangspunkt.

Ich habe mehrere Beispiele mit gefundenAVAudioPlayer. Aber ich kann keine Lösung finden, um die erforderlichen Informationen zu erhaltenAVPlayer.

Kann mir jemand eine Lösung für mein Problem einfallen lassen?

BEARBEITEN Ich möchte so etwas erstellen (aber schöner)

EDIT II

Ein Vorschlag war zu verwendenMTAudioProcessingTap um die rohen Audiodaten zu erhalten. Die Beispiele, die ich mit dem finden konnte[[[_player currentItem] asset] tracks] Array, in meinem Fall ein leeres Array. Ein weiterer Vorschlag war zu verwenden[[_player currentItem] audioMix] welches istnull für mich.

EDIT III

Nach demJahre schon scheint es noch keine lösung zu geben. Ich habe in der Tat Fortschritte gemacht, also teile ich es.

Während des Setups füge ich dem playerItem einen Schlüsselwertbeobachter hinzu:

[[[self player] currentItem] addObserver:self forKeyPath:@"tracks" options:kNilOptions context:NULL];

//////////////////////////////////////////////////////

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context
    if ([keyPath isEqualToString:@"tracks"] && [[object tracks] count] > 0) {
        for (AVPlayerItemTrack *itemTrack in [object tracks]) {
            AVAssetTrack *track = [itemTrack assetTrack];

            if ([[track mediaType] isEqualToString:AVMediaTypeAudio]) {
                [self addAudioProcessingTap:track];
                break;
            }
        }
}

- (void)addAudioProcessingTap:(AVAssetTrack *)track {
    MTAudioProcessingTapRef tap;
    MTAudioProcessingTapCallbacks callbacks;
    callbacks.version = kMTAudioProcessingTapCallbacksVersion_0;
    callbacks.clientInfo = (__bridge void *)(self);
    callbacks.init = init;
    callbacks.prepare = prepare;
    callbacks.process = process;
    callbacks.unprepare = unprepare;
    callbacks.finalize = finalise;

    // more tap setup...

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];

    AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack];
    [inputParams setAudioTapProcessor:tap];
    [audioMix setInputParameters:@[inputParams]];

    [[[self player] currentItem] setAudioMix:audioMix];
}

So weit, ist es gut. Das alles funktioniert, ich konnte den richtigen Track finden und die inputParams und audioMix usw. einrichten. Aber leider ist der einzige Rückruf, der aufgerufen wird, der init-Rückruf. Keiner der anderen wird zu irgendeinem Zeitpunkt feuern.

Ich habe verschiedene (Arten von) Stream-Quellen ausprobiert, von denen eine ein offizieller Apple HLS-Stream ist:http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8

Antworten auf die Frage(2)

Ihre Antwort auf die Frage