2012-05-11 16 views
5

Interpreto un MP3 nel mio iPhone app utilizzando AVAudioPlayer; ho bisogno di eseguire alcune operazioni in determinati momenti (diciamo 30 secondi, 1 minuto); c'è un modo per richiamare le funzioni di callback in base al tempo di riproduzione mp3?come eseguire le operazioni quando si gioca il suono in iPhone?

+0

Si dovrà creare tale logica da soli. Utilizzare un timer, avviare/arrestare/riavviare il timer in base allo stato della riproduzione (KVO sulle proprietà di AVAudioPlayer). – Till

risposta

1

ho trovato this link descrivere un immobili che sembra indicare è possibile ottenere il tempo di riproduzione corrente.

Se il suono è in riproduzione, currentTime è l'offset dell'attuale posizione di riproduzione , misurata in secondi dall'inizio del suono. Se l'audio non viene riprodotto, currentTime è l'offset della posizione in cui inizia a chiamare il metodo di riproduzione, misurato in secondi dall'avvio del suono .

Impostando questa proprietà è possibile cercare un punto specifico in un file audio o implementare le funzioni di avanzamento rapido e riavvolgimento audio.

Per controllare il tempo ed eseguire la vostra azione si può semplicemente interrogare:

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

Credo che la soluzione migliore è quella di avviare un NSTimer come si avvia il AVAudioPlayer di gioco. È possibile impostare il timer per sparare ogni mezzo secondo o giù di lì. Poi ogni volta che il timer incendi, guarda la proprietà currentTime sul lettore audio.

Per fare qualcosa a determinati intervalli, suggerirei di mantenere una variabile di istanza per il tempo di riproduzione dall'ultima volta che è stata richiamata la richiamata del timer. Poi se si fosse superato il punto critico tra l'ultimo richiamata e questo, fare la tua azione.

Così, in pseudocodice, il callback del timer:

  1. Ottenere il currentTime del vostro AVAudioPlayer
  2. Verificare se currentTime è maggiore di criticalPoint
  3. Se sì, controllare per vedere se lastCurrentTime è meno di criticalPoint
  4. Se sì anche a quello, fai la tua azione.
  5. Impostare lastCurrentTime a currentTime
+1

Purtroppo, 'currentTime' non è conforme a KVO, quindi un timer è la soluzione migliore. –

+0

Aggiungi KVO sullo stato di riproduzione per prendere in pausa/stalli in considerazione arrestando/riavviando il timer e questa soluzione dovrebbe essere perfetta. – Till

1

Sì Certo che puoi ... è difficile spero che funziona per voi, ma per me funziona ..

1- you play your mp3 file. 

2- [self performSelector:@selector(Operation:) withObject:Object afterDelay:30]; allora la funzione

-(void)Operation:(id)sender; 

chiamato; quindi è licenziato funzione dopo 30 secondi di file mp3 .. si può fare molte delle funzioni in base al tempo che vuoi ..

3- v'è altra soluzione utilizzando i timer

[NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(CheckTime:) userInfo:nil repeats:YES]; 

si sparerà funzione chiamata controllare il tempo

-(void)CheckTime:(id)sender{ 
    if (avAudioPlayerObject.currentTime == 30.0) 
    { 
     //Do Something 
     //Fire and function call such 
     [self performSelector:@selector(Operation:) withObject:Object] 
    } 
} 

allora si può cambiare intervallo di tempo che si desidera e ripete è per voi di controllare ripetere questo azione ogni 5 secondi o meno .. Spero che utile ..

Grazie

+0

Non penso che la prima soluzione possa funzionare: cosa accadrebbe se dovessi mettere in pausa la riproduzione del file audio per 1 secondo dopo 10 secondi di riproduzione e quindi riprenderla. Il timer sparerebbe 1 secondo troppo presto. –

+0

il secondo poi dovrebbe funzionare ma io però che l'utente non ha controllato il suono per mettere in pausa o riprendere .. ma se così è possibile utilizzare la seconda soluzione .. –

1

con multithreading tuo obiettivo è semplice, basta fare in questo modo:

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

penso, si desidera riprodurre diversi sound-file dopo 30sec quindi utilizzare questo codice:

1) tutti i file audio messi in Array e quindi recuperare dalla directory documento

2) quindi provare questo:

-(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

E se dovessi mettere in pausa la riproduzione del file audio per 1 secondo dopo 10 secondi di riproduzione e quindi riprendere. Il timer sparerebbe 1 secondo troppo presto. –

+0

il tuo file sonoro completo, quindi interrompe automaticamente il suono e dopo 30 secondi riproduce un altro file sonoro, nel mio codice sopra ... cosa dici che non ottengo chiaramente? – Dev

+0

Penso di aver commentato la risposta sbagliata, ma non penso che tu abbia capito la domanda. L'operazione che l'OP cita potrebbe essere qualsiasi azione, non solo l'avvio di un altro suono. E se l'OP vuole riprodurre una traccia lunga 45 secondi, ma eseguire comunque l'azione dopo 30 secondi di riproduzione. Non menzionano la lunghezza della traccia che desiderano suonare –

5

Se siete in grado di utilizzare al posto di AVPlayer AVAudio Player, è possibile impostare gli osservatori tempo limite o periodiche:

// 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]; 

AVPlayer documentazione: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVPlayer_Class/Reference/Reference.html

Problemi correlati