Juego un MP3 en mi aplicación de iPhone usando AVAudioPlayer; Necesito realizar algunas operaciones en ciertos momentos (digamos 30 segundos, 1 minuto); ¿Hay alguna forma de invocar funciones de devolución de llamada basadas en el tiempo de reproducción de mp3?¿Cómo realizar operaciones al reproducir sonido en iPhone?
Respuesta
Encontré this link describiendo una propiedad que parece indicar que puede obtener el tiempo de reproducción actual.
Si está reproduciendo el sonido, horaActual es el desplazamiento de la posición de reproducción actual , medido en segundos desde el inicio del sonido. Si el sonido no se reproduce, currentTime es el desplazamiento de donde comienza el al llamar al método de reproducción, medido en segundos desde el inicio del sonido del .
Al establecer esta propiedad, puede buscar un punto específico en un archivo de sonido o implementar funciones de avance y rebobinado de audio.
para comprobar el tiempo y llevar a cabo su acción sólo tiene que consultarlo:
if (avAudioPlayerObject.currentTime == 30.0) //You may need a more broad check. Double may not be able to exactly represent 30.0s
{
//Do Something
}
Creo que la mejor solución es iniciar una NSTimer
como empiece el juego AVAudioPlayer
. Puede configurar el temporizador para disparar cada medio segundo más o menos. Luego, cada vez que se dispara su temporizador, mire la propiedad currentTime
en su reproductor de audio.
Para hacer algo en ciertos intervalos, le sugiero que mantenga una variable de instancia para el tiempo de reproducción desde la última vez que se llamó a la devolución de llamada del temporizador. Luego, si pasó el punto crítico entre la última devolución de llamada y esto, realice su acción.
Así, en pseudocódigo, la devolución de llamada de temporizador:
- Consigue el
currentTime
de su AVAudioPlayer - Compruebe si
currentTime
es mayor quecriticalPoint
- Si es así, comprobar para ver si
lastCurrentTime
es menor quecriticalPoint
- En caso afirmativo, realice su acción.
- Establecer
lastCurrentTime
acurrentTime
Lamentablemente, 'currentTime' no es compatible con KVO, por lo que un temporizador es su mejor opción. –
Agregue KVO en el estado de reproducción para tomar pausa/paradas en cuenta al detener/reiniciar el temporizador y esta solución debe ser perfecta. – Till
Sí Claro que si ... es complicado espero que funcione para usted, pero a mí me funciona ..
1- you play your mp3 file.
2- [self performSelector:@selector(Operation:) withObject:Object afterDelay:30];
entonces la función
-(void)Operation:(id)sender;
called; entonces disparaste la función después de 30 segundos de archivo mp3 ... puedes hacer muchas funciones en función del tiempo que quieras ...
3- existe otra solución utilizando temporizadores
[NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(CheckTime:) userInfo:nil repeats:YES];
que se dispare función llamada Comprobar Tiempo
-(void)CheckTime:(id)sender{
if (avAudioPlayerObject.currentTime == 30.0)
{
//Do Something
//Fire and function call such
[self performSelector:@selector(Operation:) withObject:Object]
}
}
a continuación, puede cambiar el intervalo de tiempo que desee y se repite es para controlar repita este acción cada 5 segundos o no .. Espero que sea útil ..
Gracias
No creo que su primera solución funcione: ¿Qué pasaría si tuviera que pausar la reproducción del archivo de audio durante 1 segundo después de 10 segundos de reproducción y luego reanudarlo? El temporizador dispararía 1 segundo antes de tiempo. –
el segundo debería funcionar, pero pensé que el usuario no controló el sonido para pausar o reanudarlo ... pero si es así puede usar la segunda solución. –
con multithreading su objetivo es sencillo, basta con hacer como esto:
1 : in your main thread create a variable for storing time passed
2 : create new thread like "checkthread" that check each 30-20 sec(as you need)
3 : if the time passed is what you want do the callback
creo, que desea reproducir diferentes sonoras archivos después de 30 segundos a continuación, utilizar este código:
1) todos los archivos de sonido ponen en array y luego recuperar del directorio de documentos
2) a continuación, intente esto:
-(IBAction)play_sound
{
BackgroundPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:[Arr_tone_selected objectAtIndex:j]ofType:@"mp3"]]error:NULL];
BackgroundPlayer.delegate=self;
[BackgroundPlayer play];
}
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
[BackgroundPlayer stop];
j++;
[self performSelector:@selector(play_sound) withObject:Object afterDelay:30];
}
¿Qué pasaría si tuviera que pausar la reproducción del archivo de audio para 1 segundo después de 10 segundos de reproducción y luego reanudar. El temporizador dispararía 1 segundo antes de tiempo. –
su archivo de sonido completo, luego detiene automáticamente el sonido y después de 30 segundos reproduce otro archivo de sonido, en mi código anterior ... ¿qué dice que no entiendo claramente? – Dev
Creo que he comentado la respuesta incorrecta, pero no creo que hayas entendido la pregunta. La "operación" que menciona OP puede ser cualquier acción, no solo iniciar otro sonido. ¿Y qué ocurre si el OP desea reproducir una pista de 45 segundos de duración, pero aún realizar la acción después de 30 segundos de reproducción? No mencionan la longitud de la canción que desean tocar –
Si usted es capaz de utilizar AVPlayer en lugar de AVAudio Reproductor, es posible ajustar los observadores tiempo límite o periódicas:
// File URL or URL of a media library item
AVPlayer *player = [[AVPlayer alloc] initWithURL:url];
CMTime time = CMTimeMakeWithSeconds(30.0, 600);
NSArray *times = [NSArray arrayWithObject:[NSValue valueWithCMTime:time]];
id playerObserver = [player addBoundaryTimeObserverForTimes:times queue:NULL usingBlock:^{
NSLog(@"Playback time is 30 seconds");
}];
[player play];
// remove the observer when you're done with the player:
[player removeTimeObserver:playerObserver];
documentación AVPlayer: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVPlayer_Class/Reference/Reference.html
- 1. ¿Cómo grabar y reproducir sonido en la aplicación iPhone?
- 2. Reproducir sonido múltiple al mismo tiempo
- 3. Reproducir sonido en iPhone incluso en modo silencioso
- 4. Cómo reproducir sonido con Qt
- 5. Reproducir sonido con SoundPool
- 6. Qt - cómo grabar y reproducir sonido simultáneamente
- 7. ¿Cómo puedo reproducir un sonido en WinForms?
- 8. ¿Cómo puedo reproducir sonido en Java?
- 9. Cómo reproducir un sonido en C#, .NET
- 10. ¿Cómo reproducir un sonido de Windows estándar?
- 11. Reproducir sonidos en iPhone SDK?
- 12. ¿Grabar sonido y reproducir sonido modulado en Android?
- 13. Cómo realizar operaciones de fecha en hibernación
- 14. Reproducir (y reproducir) un sonido en safari mobile
- 15. Cómo reproducir un archivo de sonido
- 16. Reproducir sonido al recibir un mensaje de chat web
- 17. ¿Establecer ToggleButton para reproducir el sonido predeterminado al hacer clic?
- 18. Mala calidad de sonido al grabar/reproducir sonidos - Android SDK
- 19. Cómo reproducir un sonido con AVAudioPlayer en modo silencioso en iPhone
- 20. Cómo reproducir el sonido de la cámara nativa en Android
- 21. reproducir un sonido cada N milisegundos
- 22. Notificación de Android para reproducir sonido solo
- 23. Cómo reproducir tono de llamada/sonido de alarma en Android
- 24. ¿Cómo hago para reproducir un sonido de alarma en Python?
- 25. Cómo reproducir un efecto de sonido en Android
- 26. ¿El sonido no funciona en iPhone Simulator?
- 27. Reproducir clip de sonido Mp3 en mouseclick usando jplayer?
- 28. cómo reproducir el sonido del micrófono al altavoz directamente en android?
- 29. Reproducir sonido de pitido en iphone relacionado con la frecuencia y decibelios
- 30. Cómo realizar operaciones booleanas elemento prudentes en matrices numpy
Usted tendrá que crear una lógica tan mismo. Use un temporizador, comience/pare/reinicie ese temporizador dependiendo del estado de la reproducción (KVO en las propiedades de AVAudioPlayer). – Till