2010-10-02 9 views
21

Użyłem AVAudioPlayer do odtworzenia 10-sekundowego pliku WAV i działa dobrze. Teraz mogę zatrzymać WAV w 4. sekundzie, a następnie zagrać ponownie od przez 1 sekundę.AVAudioPlayer zatrzymuje dźwięk i odtwarza go od początku.

Oto kod próbowałem:

NSString *ahhhPath = [[NSBundle mainBundle] pathForResource:@"Ahhh" ofType:@"wav"]; 
AVAudioPlayer *ahhhhhSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:ahhhPath] error:NULL]; 

[ahhhhhSound stop]; 
[ahhhhhSound play]; 

Co dostaję to, że wav zatrzymuje się na 4 sekundy, ale gdy uruchomię [XXX PLAY] kolejny, wav nadal odgrywać 5th sek zamiast grania od początku.

Jak mogę to zrobić? Każda pomoc zostanie doceniona.

+0

A w skrócie brzmi pozorną objawem jest, że dźwięk nie jest odtwarzany po raz drugi - wywołanie przystanek i grać tylko spowodowane dźwięk, aby zakończyć grę i brzmiało to jak drugi zabaw został zignorowany . Tak właśnie działo się w moim kodzie, a odpowiedź poniżej naprawiła to. – Echelon

Odpowiedz

54

Apple AVAudioPlayer class reference mówi:

Sposób zatrzymania nie resetuje wartość właściwości CurrentTime 0. Innymi słowy, jeśli zadzwonisz zatrzymania podczas odtwarzania, a następnie zadzwonić do gry, odtwarzanie zostanie wznowione w miejscu, gdzie go odpuścić.

więc powinieneś być w stanie uruchomić go z:

[ahhhhhSound stop]; 
ahhhhhSound.currentTime = 0; 
[ahhhhhSound play]; 
+0

Znalazłem problem z tym na urządzeniach iOS 4.3.3 i 4.3.5 co najmniej. Działa poprawnie na urządzeniach z systemem iOS 5.0.1. (iPhone 4 i 4S) po zrobieniu zatrzymania, a następnie ustawienie currentTime na 0, a następnie odtwarzanie, odtwarzanie faktycznie nie udaje się (powraca NIE). Ciągnę tu moje włosy ... – Jonny

+0

@ Jon: Następnie zadaj nowe pytanie. To pytanie ma 1,5 roku ;-) – DarkDust

+0

Nie Okazało się obejście i jestem w biegu dla Twojej sławy ;-) – Jonny

6

Więc miałem pewne problemy, jak widać z mojego komentarza na odpowiedź DarkDust użytkownika. Problem pojawił się tylko na iOS 4.3.3/4.3.5, iPhone 4. Prawdopodobnie również wcześniejsze wersje iOS, ale nie iOS 5.0.1. W jakiś sposób sam AVAudioPlayer wydawał się "łamać", gdy go zatrzymywał, a ta ostatnia gra po prostu nie powiodła się. Właściwie "stop" wyładuje niektóre rzeczy załadowane na readyToPlay, które nie zostaną rozładowane, jeśli po prostu "zatrzymasz" odtwarzacz - zgodnie z referencją. Tak więc moim rozwiązaniem byłoby użycie pauzy zamiast stopu - uważałem, że gracz aktualnie gra - w przeciwnym razie nie byłoby powodu, aby cokolwiek zatrzymać. Teoretycznie też powinien być szybszy. Rozwiązałem to dla mnie.

if (ahhhhhSound.playing) { 
    [ahhhhhSound pause]; 
} 
ahhhhhSound.currentTime = 0; 
[ahhhhhSound play]; 

Teraz mogę znów żyć.

+0

+1 dla tego rozwiązania. Miałem problemy z zatrzymaniem (dźwięki pękałyby, tylko części końcowe odtwarzałyby inne dźwięki itp. Mam wiele instancji AVAudioPlayer). Użycie pauzy i ustawienie currentTime na 0 rozwiązuje wszystkie moje problemy! –

+0

Tak, pause() to właściwy sposób. – StackUnderflow

0

Swift:

mySound.audioPlayer?.stop() 
mySound.audioPlayer?.currentTime = 0 
mySound.audioPlayer?.play() 
Powiązane problemy