Odtwarzam pliki MP3 w mojej aplikacji na iPhone'a za pomocą AVAudioPlayer; Muszę wykonać pewne operacje w określonym czasie (powiedzmy 30 sekund, 1 minutę); czy istnieje sposób wywoływania funkcji wywołania zwrotnego w oparciu o czas odtwarzania mp3?Jak wykonywać operacje podczas odtwarzania dźwięku w telefonie iPhone?
Odpowiedz
Znalazłem this link opisujący właściwość właściwości, która wydaje się wskazywać, że można uzyskać aktualny czas odtwarzania.
Jeśli dźwięk jest odtwarzany, currentTime jest odsunięcie od aktualnej pozycji odtwarzania mierzonym w sekundach od początku dźwięku. Jeśli dźwięk nie jest odtwarzany, currentTime jest przesunięciem w momencie rozpoczęcia odtwarzania po wywołaniu metody odtwarzania, mierzonej w sekundach od rozpoczęcia dźwięku od .
Po ustawieniu tej właściwości można wyszukać określony punkt w pliku dźwiękowym lub zaimplementować funkcję szybkiego przewijania do przodu i do tyłu.
Aby sprawdzić czas i wykonywać swoje działania można po prostu zapytać go:
if (avAudioPlayerObject.currentTime == 30.0) //You may need a more broad check. Double may not be able to exactly represent 30.0s
{
//Do Something
}
Uważam, że najlepszym rozwiązaniem jest, aby rozpocząć NSTimer
jak rozpocząć AVAudioPlayer
grę. Możesz ustawić timer na ogień co pół sekundy. Następnie za każdym razem, gdy uruchamia się zegar, spójrz na właściwość currentTime
w odtwarzaczu audio.
Aby zrobić coś w określonych odstępach czasu, sugerowałbym zachowanie zmiennej instancji dla czasu odtwarzania od ostatniego wywołania zwrotnego licznika czasu. Następnie, jeśli minąłeś punkt krytyczny między ostatnim oddzwonieniem a tym, wykonaj swoją czynność.
Więc w Pseudokod, callback timera:
- uzyskać
currentTime
twoich AVAudioPlayer - Sprawdzić, czy
currentTime
jest większa niżcriticalPoint
- Jeśli tak, sprawdź, czy
lastCurrentTime
jest mniej niżcriticalPoint
- Jeśli tak, również wykonaj.
- Ustaw
lastCurrentTime
docurrentTime
Niestety, 'currentTime' nie jest zgodne z KVO, więc zegar jest twoim najlepszym wyborem. –
Dodaj KVO do statusu odtwarzania, aby uwzględnić zatrzymanie/wstrzymanie przez zatrzymanie/ponowne uruchomienie zegara i to rozwiązanie powinno być doskonałe. – Till
Tak na pewno można ... to trudne Mam nadzieję, że działa dla ciebie, ale to działa na mnie ..
1- you play your mp3 file.
2- [self performSelector:@selector(Operation:) withObject:Object afterDelay:30];
wówczas funkcja
-(void)Operation:(id)sender;
nazywana; więc wypaliłeś funkcję po 30 sekundach pliku mp3 .. możesz wykonać wiele funkcji na podstawie czasu, który chcesz ..
3- istnieje rozwiązanie wykorzystujące inne czasomierze
[NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(CheckTime:) userInfo:nil repeats:YES];
będzie ogień funkcja nazywa sprawdzić czas
-(void)CheckTime:(id)sender{
if (avAudioPlayerObject.currentTime == 30.0)
{
//Do Something
//Fire and function call such
[self performSelector:@selector(Operation:) withObject:Object]
}
}
wówczas można zmienić odstęp czasu chcesz i powtarza to, aby kontrolować to powtórzyć akcja co 5 sekund lub nie .. Mam nadzieję, że to pomoże ..
Dzięki
Nie sądzę, aby Twoje pierwsze rozwiązanie zadziałało: co się stanie, jeśli wstrzymam odtwarzanie pliku audio na 1 sekundę po 10 sekundach odtwarzania, a następnie wznowię. Timer wystrzeliłby o sekundę za wcześnie. –
sekunda powinna zadziałać, ale mimo to, że użytkownik nie kontrolował dźwięku, aby wstrzymać lub wznowić .. ale jeśli tak, to możesz użyć drugiego rozwiązania .. –
z wielowątkowości swój cel jest proste, wystarczy zrobić tak:
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
myślę, chcesz grać różne dźwiękochłonnej pliki po 30sek następnie użyć tego kodu:
1) wszystkie dźwiękochłonnej pliki umieścić w tablicy, a następnie pobrać z katalogu dokumentów
2), a następnie spróbuj tego:
-(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];
}
Co zrobić, jeśli mam wstrzymać odtwarzanie pliku audio dla 1 sekunda po 10 sekundach odtwarzania, a następnie wznów. Timer wystrzeliłby o sekundę za wcześnie. –
Twój plik dźwiękowy jest kompletny, a następnie automatycznie zatrzymuje dźwięk i po 30 sekundach odtwarza inny plik dźwiękowy, w powyższym kodzie ... co powiedziałeś, że nie otrzymałem wyraźnego? – Dev
Myślę, że skomentowałem niewłaściwą odpowiedź, ale nie sądzę, że zrozumiałeś to pytanie. "Operacja", o której wspomina PO, może być dowolną akcją, a nie tylko rozpoczynaniem kolejnego dźwięku. A co, jeśli OP chce odtwarzać utwór trwający 45 sekund, ale nadal wykonuje akcję po 30 sekundach odtwarzania. Nie wspominają o długości ścieżki, którą chcą zagrać –
Jeśli jesteś w stanie wykorzystać AVPlayer zamiast AVAudio Odtwarzacz można ustawić brzegowe lub okresowe obserwatorów czas:
// 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 dokumentację: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVPlayer_Class/Reference/Reference.html
trzeba będzie stworzyć takie Logic siebie. Użyj timera, uruchom/zatrzymaj/zrestartuj timer, w zależności od statusu odtwarzania (KVO na właściwościach AVAudioPlayer). – Till