2013-01-04 58 views
7

Tôi muốn phát một số hiệu ứng âm thanh đơn giản khi mọi người nhấn một số nút nhất định trong ứng dụng của tôi và tôi đã thử một số thứ, nhưng tôi luôn có độ trễ khiến âm thanh dường như đồng bộ hóa.Phát hiệu ứng âm thanh mà không có độ trễ trong Mục tiêu-C

Tôi đã làm theo hướng dẫn here, vì vậy tôi đã thử xây dựng trong Dịch vụ âm thanh, nhưng đã có độ trễ và tôi đã thử AVAudioPlayer, nhưng điều đó cũng có độ trễ, mặc dù tôi đã sử dụng "PrepareToPlay ".

Tôi có thực sự phải cài đặt một thư viện lớn và lộn xộn như Finch để có hiệu ứng âm thanh đơn giản mà không có độ trễ trong ứng dụng đơn giản của tôi không?

Hy vọng bạn có thể làm rõ mọi thứ cho tôi!

CẬP NHẬT

Mã cho dịch vụ âm thanh:

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

Mã cho AVAudioPlayer trong viewDidLoad:

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

Mã cho AVAudioPlayer trong phương pháp mà tôi muốn chơi các file:

[self.avSound play]; 
+5

Silly câu hỏi, nhưng bạn có chắc đó không phải là một khoảnh khắc của sự im lặng ở đầu tập tin âm thanh của bạn? Bạn đã đặt nó thông qua một cái gì đó như audacity? –

+0

Ngoài ra, bạn đang thử nghiệm như thế nào? Thiết bị? Giả lập? Bạn đang thử nghiệm phần cứng nào trên thiết bị? –

+0

Bạn đã tìm kiếm SO. Dường như có nhiều câu hỏi khác về vấn đề này. Một số gợi ý một số hacks để tải trước, những người khác đề nghị sử dụng âm thanh hệ thống (SystemSoundID) – KlausCPH

Trả lời

2

Cách tôi làm việc này (và tôi nghĩ rằng tôi có ý tưởng từ một bài đăng khác trên SO) là tạo một tệp .wav 1 giây trống và "phát" nó lúc khởi tạo. Sau đó, không có sự chậm trễ khi tôi gọi các hiệu ứng âm thanh khác.

Something như thế này trong đối tượng người chơi âm thanh của tôi

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

Sau đó, tôi chỉ có thể chơi "ding" mà không cần bất kỳ sự trì hoãn sử dụng:

AudioServicesPlaySystemSound (cid); 
+0

Cảm ơn bạn đã đề xuất. Tôi đã làm một cái gì đó tương tự (xem bên dưới). –

0

Một điều tôi thấy rằng dường như giúp là, khi nhập vào màn hình có âm thanh MIGHT được phát, để phát một phần nhỏ của âm thanh thứ hai. Điều này dường như "thủ" cơ chế âm thanh - phân bổ đối tượng nội bộ, phân trang trong công cụ vv

(. Tôi nhận thấy rằng đây là tương tự như cách tiếp cận Mike M)

1

SOLUTION

tôi cuối cùng đã làm một cái gì đó tương tự như Mike ở trên. Tôi đã kết thúc chơi âm thanh với âm lượng xuống trong 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]; 

Và sau đó trong hàm mà tôi chơi nó tôi làm:

[self.plops setVolume:1.0]; 
[self.plops play]; 
Các vấn đề liên quan