2013-01-04 43 views
7

Kullanıcılar uygulamasındaki belirli düğmelere bastığında ve bazı şeyleri denediğimde bazı basit ses efektlerini çalmak istiyorum, ancak her zaman bir ses çıkarıyor. senkron.Gecikme olmadan ses efekti çalma Objective-C

here eğitimlerini takip ettim, bu yüzden Ses Hizmetlerinde yapıyı denedim, ancak bir gecikme yaşadım ve AVAudioPlayer'ı denedim, ancak "prepareToPlay" kullanmamama rağmen bir gecikme de vardı ".

Basit uygulamamda gecikme olmaksızın basit bir ses efekti elde etmek için Finch gibi büyük ve dağınık bir kitaplık yüklemem gerekir mi?

Umarım benim için bazı şeyleri netleştirebilirsin!

GÜNCELLEME

Ses Hizmetleri için

Kodu:

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

Kodu:

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

Kod Ben dosyayı oynatmak istediğiniz yönteminde AVAudioPlayer için:

[self.avSound play]; 
+5

Aptal soru, ama emin misin ben viewDidLoad aşağı ses hacmi ile ses çalma sona erdi Ses dosyanızın başında bir sessizlik anı mı? Bunu audacity gibi bir şeyden geçirdin mi? –

+0

Ayrıca, nasıl test ediyorsunuz? Cihaz? Simülatör? Bir cihazda hangi donanımı test ediyorsunuz? –

+0

SO aradınız mı? Bu konuda birçok soru var gibi görünüyor. Bazıları ön yükleme için bazı korsanlar önerir, diğerleri sistem seslerini kullanmayı önerir (SystemSoundID) – KlausCPH

cevap

2

Bunu işe koyduğum şekilde (ve sanırım SO üzerinde başka bir yazıdan bir fikrim var) boş bir 1 saniyelik .wav dosyası oluşturmak ve bunu başlatırken "oynatmak" oldu. Bundan sonra, diğer ses efektlerini aradığımda gecikme yaşanmadı. Benim ses çalar nesnesi böyle

şey

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

Sonra ben sadece kullanarak herhangi bir gecikme olmaksızın "ding" oynayabileceğini:

AudioServicesPlaySystemSound (cid); 
+0

Öneriniz için teşekkürler. Benzer bir şey yaptım (aşağıya bakınız). –

0

tek şey olduğunu yardımcı olacak gibi görünüyor bulundu, Sesin, MIGHT'un çalınacağı ekrana girdikten sonra, bir saniyenin kesir kısmını oynatmak için. vb iç nesneleri şeyler sayfalama tahsis

(. Bu Mike M'in yaklaşımına benzer olduğunu gözlemlemek)

1

ÇÖZÜM

I - Bu kadar "asal" sesi mekanizması görünüyor Yukarıdaki Mike benzer bir şey yaptı. Sonra

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

Ve işlevinde Yapmam oynamak burada:: yoktur

[self.plops setVolume:1.0]; 
[self.plops play];