2012-06-25 22 views
10

Tengo una aplicación iOS que reproduce una banda sonora de fondo con un AVPlayer y reproduce otros clips de sonido "en la parte superior" con un segundo AVPlayer. (Los clips de sonido se transmiten desde Internet, de ahí el requisito de AVPlayer). El problema es que cuando el segundo AVPlayer comienza a reproducirse, hace que el fondo de AVPlayer se detenga durante una fracción de segundo, similar a lo que se describe en este comentario:Error de audio al reproducir dos archivos de audio AVPlayer simultáneamente

Play multiple Audio Files with AVPlayer


estoy preparando los clips de audio con este método:

- (void)prepareAudio:(NSURL *)assetURL { 

asset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 
playerItem = [AVPlayerItem playerItemWithAsset:asset]; 
[player replaceCurrentItemWithPlayerItem:playerItem]; 


[playerItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil]; 
[playerItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil]; 


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

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(playerItemFailedToReachEnd:) 
              name:AVPlayerItemFailedToPlayToEndTimeNotification 
              object:[player currentItem]]; 
} 

... y luego invocar [player play]; cuando w hormiga para escuchar cada sonido


¿Hay algo que tengo que hacer cuando me juego hasta la sesión de audio o de cada instancia de la AVPlayer, por lo que los sonidos se mezclan sin el fallo?

Respuesta

2

Esto es probablemente como resultado del inicio del codificador de software. Verá un pico muy grande en la memoria cuando el codificador de software intente reproducir el segundo clip de sonido. Echar un vistazo a la sección de documentos de manzana "IOS Hardware y software para códecs de audio" http://developer.apple.com/library/ios/#DOCUMENTATION/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html

"Cuando se utiliza la decodificación asistida por hardware, el dispositivo puede reproducir una única instancia de uno de los formatos compatibles a la vez."

También ... "Para reproducir múltiples sonidos con el mejor rendimiento, o para reproducir de manera eficiente los sonidos mientras el iPod se reproduce en segundo plano, use audio lineal PCM (sin comprimir) o IMA4 (comprimido)".

Si no tiene otra opción en los códecs multimedia que puede proporcionar, eche un vistazo al marco AudioUnit para obtener una mezcla más perfecta. En particular, el "Mezclador de audio (MixerHost)" en http://developer.apple.com/library/ios/#samplecode/MixerHost/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010210

+0

Esto no puede ser. He hecho un par de experimentos usando archivos sin comprimir PCM rectos, y el problema continúa existiendo. Dicho esto, parece tener algo que ver con la aplicación AVMutableAudioMix. Cada vez que se aplica, es cuando se produce el bobble. –

1

Finalmente descubrí cuál es el problema. Estoy escribiendo una aplicación en la que estoy ajustando el volumen usando la clase AVMutableAudioMixInputParameters, y estoy intentando normalizar el audio usando esta clase subiendo o bajando el volumen por muestra.

Si bien este enfoque funciona cuando solo hay unas pocas rampas de volumen, parece que la aplicación de las rampas ocurre en el mismo hilo que almacena el audio, así que cuando uso demasiados (> ~ 1000) de ellos, esto eventualmente consume la CPU que debería estar ocupada almacenando el audio, y luego tiene un ggg-glitch en el audio.

Mi solución fue refactorizar mi algoritmo de normalización de volumen para usar menos rampas de volumen para lograr lo mismo. Una vez que pude obtener cada conjunto de rampas de volumen/canción a aproximadamente 500 o así, ya no tuve el problema, y ​​el problema de audio desapareció.

Cuestiones relacionadas