2013-01-04 11 views
7

Chcę odtwarzać proste efekty dźwiękowe, gdy ludzie naciskają pewne przyciski w mojej aplikacji i próbowałem kilku rzeczy, ale zawsze mam opóźnienie, które sprawia, że ​​dźwięk wydaje się synchronizacja.Odtwarzanie efektów dźwiękowych bez opóźnień w Objective-C

Podążyłem za samouczkami here, więc wypróbowałem kompilację w usłudze audio, ale z opóźnieniem i wypróbowałem odtwarzacz AVAudioPlayer, ale miało to również opóźnienie, mimo że użyłem "prepareToPlay" ".

Czy muszę zainstalować dużą i nieporządną bibliotekę, taką jak Finch, aby uzyskać prosty efekt dźwiękowy bez opóźnień w mojej prostej aplikacji?

Mam nadzieję, że możesz wyjaśnić dla mnie rzeczy!

UPDATE

Kod audio Services:

NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"PlopsX4" 
             withExtension:@"aif"]; 
AudioServicesCreateSystemSoundID((CFURLRef)soundURL, &sound1); 
AudioServicesPlaySystemSound(sound1); 

Kod AVAudioPlayer w viewDidLoad:

NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"PlopsX4" 
             withExtension:@"aif"]; 
self.avSound = [[AVAudioPlayer alloc] 
     initWithContentsOfURL:soundURL error:nil]; 
[self.avSound prepareToPlay] 

Kod AVAudioPlayer w metodzie, gdzie chcę, aby odtworzyć plik:

[self.avSound play]; 
+5

głupie pytanie, ale czy jesteś pewien, że nie jest chwila ciszy na początku pliku audio? Czy przełożyłeś to na coś w rodzaju zuchwałości? –

+0

Ponadto, w jaki sposób testujesz? Urządzenie? Symulator? Na jakim sprzęcie testujesz, jeśli znajduje się on na urządzeniu? –

+0

Szukałeś SO. Wygląda na to, że jest wiele innych pytań na ten temat. Niektóre sugerują pewne hacki do wstępnego załadowania, inne sugerują używanie dźwięków systemowych (SystemSoundID). – KlausCPH

Odpowiedz

2

Sposób, w jaki mam to do pracy (i myślę, że dostałem pomysł z innego postu na SO) był stworzenie pustego 1-sekundowego pliku .wav i "odtworzenia" go podczas inicjalizacji. Potem nie było żadnej zwłoki, gdy zadzwoniłem do innych efektów dźwiękowych.

Coś takiego w moim dźwięku obiektu odtwarzacza

SystemSoundID blID; 
    SystemSoundID cID; 

    +(void)doInit 
    { 
      if (spinitialized){ 
        AudioServicesPlaySystemSound (blID); 
        return; 
      } 



      NSString *str = [[NSBundle mainBundle] pathForResource:@"ding.wav" ofType:@""]; 
      NSURL *uref = [NSURL fileURLWithPath:str]; 
      OSStatus error = AudioServicesCreateSystemSoundID ((CFURLRef)uref, &cID); 
      if (error) NSLog(@"SoundPlayer doInit Error is %ld",error); 

      str = [[NSBundle mainBundle] pathForResource:@"blank.wav" ofType:@""]; 
      uref = [NSURL fileURLWithPath:str]; 
      error = AudioServicesCreateSystemSoundID ((CFURLRef)uref, &blID); 
      if (error) NSLog(@"SoundPlayer doInit Error is %ld",error); 

      AudioServicesPlaySystemSound (blID); 

      spinitialized = YES; 
    } 

Wtedy może po prostu grać „ding”, bez żadnych opóźnień, używając:

AudioServicesPlaySystemSound (cid); 
+0

Dzięki za sugestię. Zrobiłem coś podobnego (patrz poniżej). –

0

Jedno stwierdziliśmy, że wydaje się pomagać to, po wejściu na ekran, na którym odtwarzany jest dźwięk MIGHT, odtwarzać ułamek sekundy dźwięku. Wydaje się to "prime" mechanizm dźwięku - przydzielanie obiektów wewnętrznych, przywołania w rzeczy itd

(. I zauważyć, że jest to podobne do podejścia Mike M.)

1

ROZWIĄZANIE

I skończyło się robić coś podobnego, jak Mike powyżej. Skończyło się na odtwarzanie dźwięku z poziomu głośności w viewDidLoad:

NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"PlopsX4" 
               withExtension:@"aif"]; 
self.plops = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:nil]; 
[self.plops setVolume:0.0]; 
[self.plops play]; 

a następnie w zależności gdzie gram go zrobić:

[self.plops setVolume:1.0]; 
[self.plops play]; 
Powiązane problemy