2010-10-02 18 views
21

Utilicé el AVAudioPlayer para reproducir un archivo wav de 10 segundos y funciona bien. Ahora qué debo detener el wav en el 4º sec y luego volver a jugarlo desde el muy 1er seg.AVAudioPlayer detener un sonido y reproducirlo desde el principio

Este es el código Traté:

NSString *ahhhPath = [[NSBundle mainBundle] pathForResource:@"Ahhh" ofType:@"wav"]; 
AVAudioPlayer *ahhhhhSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:ahhhPath] error:NULL]; 

[ahhhhhSound stop]; 
[ahhhhhSound play]; 

Lo que se ve es, el wav se detiene en el cuarto seg pero cuando corro el [juego XXX] vez más, el wav sigue desempeñando el 5 seg vez de jugar desde el principio.

¿Cómo podría hacer esto? Cualquier ayuda será apreciada.

+0

Y para abreviar suena el síntoma evidente es que el sonido no juega la segunda vez - pidiendo parada y jugar solo causó el sonido para terminar de juego y sonaba como el segundo juego fue ignorada . Eso es lo que estaba sucediendo en mi código, y la respuesta a continuación lo solucionó. – Echelon

Respuesta

54

de Apple AVAudioPlayer class reference dice:

El método de paro no se restablece el valor de la propiedad horaActual a 0. En otras palabras, si se llama parada durante la reproducción y luego llamar reproducción, la reproducción se reanuda en el punto en que se Parado.

Por lo que debe ser capaz de reiniciar con:

[ahhhhhSound stop]; 
ahhhhhSound.currentTime = 0; 
[ahhhhhSound play]; 
+0

He encontrado un problema con esto en dispositivos iOS 4.3.3 y 4.3.5 al menos. Funciona bien en dispositivos iOS 5.0.1. (iPhone 4 y 4S) después de detener, luego estableciendo currentTime en 0, y luego reproducir, el juego realmente falla (regresando NO). Estoy tirando de mi cabello aquí ... – Jonny

+0

@Jonny: Luego, haz una nueva pregunta. Esta pregunta tiene 1,5 años ;-) – DarkDust

+0

No, descubrí una solución y estoy a la carrera por su fama ;-) – Jonny

6

así que tuve algunas dificultades como se puede ver en mi comentario sobre la respuesta de DarkDust. El problema solo apareció en iOS 4.3.3/4.3.5, iPhone 4. Posiblemente versiones anteriores de iOS también, pero no iOS 5.0.1. De alguna manera, el AVAudioPlayer parecía "romperse" al detenerlo y el último juego simplemente fallaba inexplicablemente. En realidad, una "parada" descargaría algunas cosas cargadas en prepareToPlay, que no se descarga si solo "pausa" el reproductor, según la referencia. Así que mi solución sería usar pausa en lugar de detenerse - considerado que el jugador está jugando actualmente - de lo contrario no habría ninguna razón para detener nada. En teoría, debería ser más rápido también. Lo resolvió para mí.

if (ahhhhhSound.playing) { 
    [ahhhhhSound pause]; 
} 
ahhhhhSound.currentTime = 0; 
[ahhhhhSound play]; 

Ahora puedo seguir con la vida otra vez.

+0

+1 a esta solución. Estaba teniendo problemas con la parada (los sonidos se romperían, solo partes finales reproducirían otros sonidos, etc. Tengo varias instancias de AVAudioPlayer). El uso de pausa y la configuración de CurrentTime en 0 resuelve todos mis problemas. –

+0

Sí, pause() es la forma correcta de hacerlo. – StackUnderflow

0

Swift:

mySound.audioPlayer?.stop() 
mySound.audioPlayer?.currentTime = 0 
mySound.audioPlayer?.play() 
Cuestiones relacionadas