Reproduzca varios archivos de audio con AVPlayer

Estoy intentando reproducir varios sonidos al mismo tiempo.

El enfoque que tomé inicialmente fue crear varios jugadores, pero parece equivocado.

¿Cuál es la mejor manera de reproducir varios archivos de audio al mismo tiempo?

¿Es a través de hacerlos AVAssets, pero en este caso cómo me detendría y los reproduciría cuando quisiera?

Realmente aprecio tu ayuda.

La razón por la que necesito AVPlayer es buscar sonidos de la biblioteca del iPod.

Finalmente obtuve una respuesta de TechSupport of Apple Dev Team y parece que estoy en el camino correcto cuando decidí usar varios AVPlayer.

preguntado el 31 de mayo de 11 a las 18:05

Estoy bastante seguro de que varios AVAudioPlayers son el camino a seguir si tienes que usar AVAudioPlayers. Simplemente configúrelos y actívelos al mismo tiempo. Recuerde liberar cualquier asignación y debería estar bien. Solo tenga en cuenta que AVAudio es un poco lento en comparación con algo como openAL. -

el problema con 2 jugadores al que me enfrento es ese. Una vez que empiezo a jugar con el segundo jugador mientras el primero está encendido, el primero se detiene por una fracción de segundo y luego continúan jugando. -

Todavía no he intentado implementar openAL con la biblioteca de iphone, pero hay un excelente administrador de sonido openAL gratuito que ya está configurado y optimizado. Vea si ayuda: 71squared.com/2011/01/latest-sound-manager -

Rouslan, ¿alguna actualización sobre cómo arreglaste esto? -

Hola David, debería haber varios AVPlayers al final del día, y el problema con la detención es la tasa de bits real del archivo, si son diferentes a los que hay, hay un problema, si no todo se reproduce bien. En otras palabras, los archivos deben tener la misma velocidad de bits. -

4 Respuestas

Para cada sonido que desee hacer, cree un nuevo AVPlayer.

NSURL *url = [NSURL URLWithString:pathToYourFile];
AVPlayer *audioPlayer = [[AVPlayer alloc] initWithURL:url];
[audioPlayer play];

Respondido 21 ago 11, 18:08

@David Morton, como se describe en la publicación original al final de su propia pregunta, y como sugiere esta respuesta, usaría un AVPlayer diferente para cada sonido. Si no necesita que sus sonidos se transmitan y puede usar sonidos en su caja de arena, puede usar múltiples instancias de AVAudioPlayer, que es lo que hace mi aplicación. - john.k.doe

Utilizo varias instancias. La falla todavía existe. - david morton

@ john.k. ¿puedes ayudarme? Estoy usando varios reproductores como sugieres y el sonido aún se interrumpe. - babero

Nunca he respondido una pregunta aquí y no sé si alguien todavía está esperando una respuesta a esto, pero aquí está mi opinión ... Intente esto y debería funcionar, actualmente lo estoy usando para reproducir más de 12 muestras de audio simultáneas. Pido disculpas si estoy haciendo algo nuevo ..

Presiona un botón y ejecuta este código ...

Pero primero necesitas:

  1. Necesitamos importar AVFoundation para proyectar y #importar en un archivo .h y luego podemos reproducir sonido con esto.
  2. Necesito poner "AVAudioPlayer * myAudio;" sin comillas, por supuesto, en algún lugar en la parte superior (generalmente en la parte superior de viewDidLoad).

Entonces solo ...

-(IBAction)playButtonPressed:(id)sender {

    NSURL *yourMusicFile;
    yourMusicFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"your_Song_Name" ofType:@"mp3"]];

    myAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:nil];
    [myAudio play];
    NSLog(@"Button -playButtonPressed- has been pressed!");
}

Respondido 14 Jul 14, 12:07

¿podrías ayudarme por favor? stackoverflow.com/questions/54345702 - babero

Parece que si presiona un botón dos veces, se iniciará un nuevo reproductor de audio y perderá el último reproductor de audio que ya se está reproduciendo. - AsifHabib

Bueno, mi solución surge de la experiencia. Puedo cocinar rápidamente un proyecto si es necesario. Pero también, requiere el uso de un API de MoMu en Stanford. Implica la creación de objetos WvIn y WvOut para leer los archivos. Las muestras de audio de estos objetos simplemente necesitan alimentarse al búfer de salida para reproducir los archivos simultáneamente. Aunque la API usa AVFoundation, no hay un uso explícito de AVFoundation en este proyecto.

Respondido 25 Jul 12, 20:07

Básicamente, lo que dicen todos los demás, asegúrese de crear un reproductor de audio para cada fuente.

Lo que también debes hacer es MANTENER UNA REFERENCIA FUERTE A TODOS LOS OBJETOS DEL JUGADOR.

Si no lo hace, se liberan y la reproducción se detiene.

Tuve este problema cuando solo guardaba una referencia a la última fuente que quería reproducir. Esto significaba que solo escucharía la última fuente de datos y pensé que el problema tenía algo que ver con la configuración de reproducción simultánea, pero en realidad era solo que los otros reproductores estaban siendo desasignados y, por lo tanto, la reproducción se detendría.

 try? AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, options: .mixWithOthers)
            try? AVAudioSession.sharedInstance().setActive(true)

También utilicé el fragmento anterior antes de crear y reproducir mis fuentes de audio.

Respondido el 06 de diciembre de 20 a las 18:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.