Medidor de nivel de transmisión en vivo AVPlayer HLS (Mostrar datos FFT)

Estoy usando AVPlayer para una aplicación de radio que usa HTTP en vivo. Ahora quiero implementar un medidor de nivel para esa transmisión de audio. Lo mejor sería un medidor de nivel que muestra las diferentes frecuencias, pero una simple solución izquierda / derecha sería un gran punto de partida.

Encontré varios ejemplos con AVAudioPlayer . Pero no puedo encontrar una solución para get la información requerida fuera de AVPlayer .

¿Alguien puede pensar en una solución para mi problema?

EDIT Quiero crear algo como esto (pero mejor)

buen nivelímetro

EDIT II

Una sugerencia era utilizar MTAudioProcessingTap para get los datos de audio sin procesar. Los ejemplos que pude encontrar utilizando la [[[_player currentItem] asset] tracks] matriz, que es, en mi caso, una matriz vacía. Otra sugerencia fue utilizar [[_player currentItem] audioMix] que es null para mí.

EDIT III

Después de años , todavía no parece haber una solución. Realmente progresé, así que lo estoy compartiendo.

Durante la installation, estoy agregando un observador de valor key al playerItem:

 [[[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]; } 

Hasta aquí todo bien. Todo esto funciona, pude encontrar el path correcto y configurar InputParams y audioMix, etc. Pero desafortunadamente, la única callback, que se llama, es la callback init. Ninguno de los demás disparará en ningún momento.

Probé diferentes (types de) fonts de transmisión, una de ellas una secuencia oficial de Apple HLS: http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8

Lamentablemente, el uso de un flujo de HLS con AVFoundation no le otorga ningún control sobre las pistas de audio. Me encontré con el mismo problema tratando de silenciar un flujo de HLS, que resultó ser imposible.

La única forma en que podría leer datos de audio sería acceder a AVAudioSession .

EDITAR

Puede acceder a AVAudioSession así:

 [AVAudioSession shanetworkingInstance] 

Aquí está la documentation de AVAudioSession

La medición de audio usando AVPlayer parece ser un problema que aún está en curso. Dicho eso, creo que se puede llegar a la solución combinando AVPlayer con AVAudioRecorder .

Mientras que las dos classs tienen propósitos aparentemente contradictorios, hay un trabajo que permite a AVAudioRecorder acceder a la salida de audio de AVPlayer .

Reproductor / grabador

Como se describe en esta Respuesta de desbordamiento de stack , es posible grabar el audio de un AVPlayer si accede al cambio de ruta de audio utilizando kAudioSessionProperty_AudioRouteChange .

Tenga en count que la grabación de audio debe iniciarse después de acceder al cambio de ruta de audio. Utilice la respuesta de stack vinculada como reference: incluye más detalles y el código necesario.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~

Una vez que tiene acceso a la ruta de audio del AVPlayer y está grabando, la medición es relativamente sencilla.

Niveles de audio

En mi respuesta a una pregunta de stack sobre la medición de la input del micrófono, describo los pasos necesarios para acceder a las mediciones del nivel de audio. El uso de AVAudioRecorder para monitorear los cambios de volumen es más complejo de lo que uno podría pensar, por lo que incluí un proyecto GitHub que actúa como una plantilla para monitorear los cambios de audio durante la grabación.

~~~~~~~~~~~~~~~~~~~~~~~~~~ Tenga en count ~~~~~~~~~~~~~~~~~~~~~~ ~~~~

Esta combinación durante una transmisión en vivo de HLS no es algo que haya probado. Esta respuesta es estrictamente teórica, por lo que puede necesitar un buen entendimiento de ambas classs para que funcione completamente.