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?
risposta
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
}
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:
- Ottenere il
currentTime
del vostro AVAudioPlayer - Verificare se
currentTime
è maggiore dicriticalPoint
- Se sì, controllare per vedere se
lastCurrentTime
è meno dicriticalPoint
- Se sì anche a quello, fai la tua azione.
- Impostare
lastCurrentTime
acurrentTime
Purtroppo, 'currentTime' non è conforme a KVO, quindi un timer è la soluzione migliore. –
Aggiungi KVO sullo stato di riproduzione per prendere in pausa/stalli in considerazione arrestando/riavviando il timer e questa soluzione dovrebbe essere perfetta. – Till
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
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. –
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 .. –
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
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];
}
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. –
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
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 –
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
- 1. Swift, come riprodurre il suono quando si preme un pulsante
- 2. Come si gioca mp3 dal URL
- 3. jQuery: Come si precarica il suono?
- 4. Come eseguire le operazioni di set in XPath 1.0
- 5. Come silenziare il suono dell'otturatore della fotocamera di iPhone?
- 6. Notifica push iPhone - Come utilizzare il suono predefinito
- 7. Come si gioca il file .mp3 dalle risorse in C#?
- 8. Come specificare un ordine valido per le operazioni dipendenti quando si definiscono le relazioni di entità?
- 9. Come per mettere in pausa il suono quando l'uso SpriteKit
- 10. Come iniziare suono dopo suono in soundmanager2
- 11. Come eseguire le operazioni del filesystem nella transazione con php?
- 12. Ottenere la frequenza del suono su iPhone
- 13. come si gioca a un file wav in python?
- 14. vibrare iPhone/iPod con suono personalizzato
- 15. Come eseguire più operazioni di missaggio in un unico comando
- 16. Passaggio generico e utilizzo, posso eseguire le seguenti operazioni?
- 17. Come si gioca al file mp3 in C++?
- 18. Come eseguire Gioca Framework 2.2.0 con -feature opzione
- 19. Come si eseguono operazioni bit in glsl
- 20. Fare clic all'inizio del suono quando si utilizza Lame
- 21. Come si gioca a gif in Android dall'URL?
- 22. Come si gioca a GIF animate in TextView?
- 23. Come eseguire operazioni aritmetiche nei CSS?
- 24. laravel eseguire più operazioni pianificate
- 25. Come ripetere il suono della suoneria
- 26. come si gioca a blocchi <audio> uno ad uno senza pop e clic?
- 27. Come eseguire il debug di PhantomJS quando si esegue Karma
- 28. Come eseguire il codice JavaScript quando si ripristina un modulo?
- 29. Come eseguire il codice quando si cancella un annullamento?
- 30. Come si applicano le operazioni matematiche alle dimensioni Android?
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