Reproducción de múltiples pistas de mp3 para la aplicación iOS

Estoy haciendo una aplicación que consiste en reproducir una canción en un formatting de múltiples pistas (batería, voz, guitarra, piano, etc.). No necesito hacer ningún procesamiento de audio de lujo para cada pista, todo lo que necesito para poder hacer es reproducir, pausar y silenciar / activar cada pista.

Había estado usando varias instancias de AVAudioPlayer pero al realizar la testing del dispositivo, noté que las pistas están jugando un poco fuera de synchronization cuando se reproducen por primera vez. Además, cuando hago pausas y reproduzco las pistas continúan desincronizando. Después de un poco de investigación me di count de que AVAudioplayer solo tiene demasiada latencia y no funcionará para mi aplicación.

En mi aplicación, básicamente tenía un NSArray de AVAudioPlayers que recorría y ejecutaba cada uno o pausaba / detenía cada uno, estoy seguro de que esto es lo que causó que se desincronizara en el dispositivo.

Parecía que el mezclador de audio de Apple funcionaría bien para mí, pero cuando bash implementarlo obtengo un error EXC_BAD_ACCESS que no puedo descifrar.

Sé que la respuesta es usar OpenAL o unidades de audio, pero parece que no es necesario pasar semanas aprendiendo sobre esto cuando todo lo que necesito es jugar alnetworkingedor de 5 pistas .mp3 al mismo time. ¿Alguien tiene alguna sugerencia sobre cómo lograr esto? Gracias

Gracias a la sugerencia de Admsyn pude encontrar una solución.

AVAudioPlayer tiene una propiedad currentTime que devuelve la hora actual de una pista y también se puede configurar.

Entonces implementé startSynchronizedPlayback tal como lo indicó admsyn y luego agregué lo siguiente cuando detuve las pistas:

-(void) stopAll { int count = [tracksArr count]; for(int i = 0; i < count; i++) { trackModel = [tracksArr objectAtIndex:i] if(i = 0) { currentTime = [trackModel currentTime] } [trackModel stop] [trackModel setCurrentTime:currentTime] } { 

Este código básicamente gira a través de mi set de pistas que cada una tiene su propio AVAudioPlayer, agarra la hora actual de la primera pista y luego establece todas las pistas siguientes para ese momento. Ahora, cuando utilizo el método startSynchronizedPlayback, todos se reproducen en synchronization y pausar el desgajado también los mantiene sincronizados. Espero que esto sea útil para alguien que intenta mantener las pistas sincronizadas.

Si está enviando posts de play individuales a cada AVAudioPlayer, es muy probable que los posts lleguen a momentos diferentes, o que los AVAudioPlayers terminen su fase de calentamiento fuera de synchronization entre sí. Debería utilizar playAtTime: y la propiedad deviceCurrentTime para lograr una synchronization adecuada. Tenga en count la descripción de deviceCurrentTime:

Use esta propiedad para indicar "ahora" al llamar al método playAtTime: instance. Al configurar múltiples reproductores de audio para que se reproduzcan en un desplazamiento especificado desde deviceCurrentTime, puede realizar una synchronization precisa, como se describe en la discusión de ese método.

También tenga en count el código de ejemplo en playAtTime: discusión:

 // Before calling this method, instantiate two AVAudioPlayer objects and // assign each of them a sound. - (void) startSynchronizedPlayback { NSTimeInterval shortStartDelay = 0.01; // seconds NSTimeInterval now = player.deviceCurrentTime; [player playAtTime: now + shortStartDelay]; [secondPlayer playAtTime: now + shortStartDelay]; // Here, update state and user interface for each player, as appropriate } 

Si puede decodificar los files en el disco, las unidades de audio probablemente sean la solución que proporcione la mejor latencia. Si decides usar una architecture así, también debes echar un vistazo a Novocaine:

https://github.com/alexbw/novocaine

Ese marco lleva mucho dolor de cabeza al tratar con unidades de audio.

    Intereting Posts