2012-05-11 20 views
5

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?

+0

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

Respuesta

1

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 
} 
8

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:

  1. Consigue el currentTime de su AVAudioPlayer
  2. Compruebe si currentTime es mayor que criticalPoint
  3. Si es así, comprobar para ver si lastCurrentTime es menor que criticalPoint
  4. En caso afirmativo, realice su acción.
  5. Establecer lastCurrentTime a currentTime
+1

Lamentablemente, 'currentTime' no es compatible con KVO, por lo que un temporizador es su mejor opción. –

+0

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

1

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

+0

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. –

+0

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. –

1

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 
1

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]; 
} 
+0

¿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. –

+0

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

+0

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 –

5

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

Cuestiones relacionadas