2012-05-11 17 views
5

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?

+0

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

Odpowiedz

1

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

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:

  1. uzyskać currentTime twoich AVAudioPlayer
  2. Sprawdzić, czy currentTime jest większa niż criticalPoint
  3. Jeśli tak, sprawdź, czy lastCurrentTime jest mniej niż criticalPoint
  4. Jeśli tak, również wykonaj.
  5. Ustaw lastCurrentTime do currentTime
+1

Niestety, 'currentTime' nie jest zgodne z KVO, więc zegar jest twoim najlepszym wyborem. –

+0

Dodaj KVO do statusu odtwarzania, aby uwzględnić zatrzymanie/wstrzymanie przez zatrzymanie/ponowne uruchomienie zegara i to rozwiązanie powinno być doskonałe. – Till

1

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

+0

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

+0

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

1

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 
1

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

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

+0

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

+0

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

5

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

Powiązane problemy