AVPlayer / AVAudioMix se desvanecen los clics de efecto al principio

Estoy tratando de implementar un efecto de fundido basado en AVPlayer + AVAudioMix + AVAudioMixInputParameters. Básicamente funciona, excepto cuando se reproduce el audio por primera vez después de iniciar mi aplicación, hay un clic al principio. Las jugadas subsiguientes funcionan de manera perfecta, pero la falla por primera vez es bastante estable y reproducible.

El button Mi reproducción está habilitado solo después de que el estado de AVPlayerItem esté configurado en listo, por lo que es imposible disparar un método de reproducción mientras el reproductor no esté listo. De hecho, no importa cuánto time espere después de cargar el file de audio y build todos los objects.

Esto sucede en OS X, no lo he probado en iOS (todavía).

Tenga en count que para esta testing necesita un file de audio que comience con sonido y no silencio. Aquí está mi código eliminado sin la parte GUI ( testFadeIn es el punto de input):

 static AVPlayer* player; static void* PlayerItemStatusObserverContext = &PlayerItemStatusObserverContext; - (void)testFadeIn { AVURLAsset* asset = [AVURLAsset.alloc initWithURL:[NSURL fileURLWithPath:@"Helicopter.m4a"] options:@{AVURLAssetPreferPreciseDurationAndTimingKey: @YES}]; AVPlayerItem* item = [AVPlayerItem playerItemWithAsset:asset]; player = [AVPlayer playerWithPlayerItem:item]; [item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:PlayerItemStatusObserverContext]; } - (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context { if (context == PlayerItemStatusObserverContext) { AVPlayerStatus status = (AVPlayerStatus)[[change objectForKey:NSKeyValueChangeNewKey] integerValue]; if (status == AVPlayerStatusReadyToPlay) { [self applyFadeIn]; [self performSelector:@selector(play:) withObject:nil afterDelay:1.0]; } } } - (void)applyFadeIn { assert(player.currentItem.tracks.firstObject); AVMutableAudioMixInputParameters* fadeIn = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:player.currentItem.tracks.firstObject]; [fadeIn setVolume:0 atTime:kCMTimeZero]; [fadeIn setVolume:1 atTime:CMTimeMake(2, 1)]; NSMutableArray* paramsArray = [NSMutableArray new]; [paramsArray addObject:fadeIn]; AVMutableAudioMix* audioMix = [AVMutableAudioMix audioMix]; audioMix.inputParameters = paramsArray; player.currentItem.audioMix = audioMix; } - (void)play:(id)unused { [player play]; } 

¡Hacer clic! ¿Qué hay de malo en esto?

Editar :

Una solución obvia que utilizo en este momento es: cuando el jugador informa que está listo, hago una breve reproducción de 100 ms con volumen = 0, luego restablecimiento de CurrentTime y volumen y solo entonces informo a la aplicación principal que el jugador está listo. De esta manera no hay clics. Curiosamente, cualquier cosa less de 100 ms todavía da el clic.

Esto parece ser un problema con algo que AVFoundation está almacenando en caching después de la primera reproducción. No son las pistas, ya que están disponibles cuando configuro el desvanecimiento en params, ni el estado de búsqueda.