2012-10-24 125 views
1

我有一個iPhone應用程序,當用戶正在進行測試時,我可以播放聲音。除了第一次播放聲音時有效,我假設將聲音加載到內存中。我如何預加載聲音?這裏是我的聲音代碼:如何預加載聲音?

- (void)doBuzz:(id)sender { 
SystemSoundID buzzsoundID; 
NSString *buzzsoundFile = [[NSBundle mainBundle] 
          pathForResource:@"buzz" ofType:@"caf"]; 

AudioServicesCreateSystemSoundID((CFURLRef) 
           [NSURL fileURLWithPath:buzzsoundFile] 
           , &buzzsoundID); 
AudioServicesPlaySystemSound(buzzsoundID); 

}

回答

1

我通過將SystemSoundID的聲明移動到我的UIViewController的.h文件中,然後設置NSString並從ViewDidLoad調用AudioServicesCreateSystemSoundID來修復聲音延遲問題。然後,當我想播放聲音時,而不是調用doBuzz方法,只需將其替換爲AudioServicesPlaySystemSound即可。

-1

預緊使用performSelectorInBackground:@selector(<SELECTOR>)的聲音。

您還可以在應用程序啓動或之前的某個位置加載文件,而不是實際上在觸摸。

+0

我絕對想在應用程序啓動時加載。感謝您的信息。然而,請原諒我的無知,但我不明白你的答案。 SELECTOR會是什麼? – Rick

1

看看AVAudioPlayer,你可以設置和重新使用。但更重要的是,當你設置它時,你可以告訴它「準備播放」,它將聲音預加載到內存中。所以,當你真的告訴玩家玩,它立即播放。我方便,最近寫了這個方法的東西,它創建並返回一個AVAudioPlayer對象:

 
+(AVAudioPlayer *)playerForFile:(NSString *)fileName 
{ 
    NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"caf"]; 
    NSURL *url = [NSURL fileURLWithPath:filePath]; 
    NSData *soundData = [NSData dataWithContentsOfURL:url]; 
    NSError *error = nil; 
    AVAudioPlayer *player = [[[AVAudioPlayer alloc] initWithData:soundData error:&error] autorelease]; 
    if (error) 
     NSLog(@"error creating player for %@: %@", fileName, [error localizedDescription]); 

    return (error ? nil : player); 
} 

某處在您的應用程序,你可能建立一個球員的對象,像這樣:

AVAudioPlayer *buzzSoundPlayer = [MyClass playerForFile:@"buzz"]; 
if (buzzSoundPlayer) { 
    [buzzsoundPlayer prepareToPlay]; 
} 

當你要玩聲音:

[buzzSoundPlayer setCurrentTime:0]; 
[buzzSoundPlayer play]; 

您必須將當前時間設置爲0,即聲音文件的開頭,每次你玩它,因爲聲音結束時,解放軍時間ying,「當前時間」在最後。所以後續的播放它的請求將不起作用。所以我們將當前時間設置回到開始。

您也可以爲您的播放器設置delegate,並在聲音播放結束後通過委託方法通知您。或者,您可以將當前時間重置爲0。

您可以在Apple的文檔中閱讀關於AVAudioPlayerAVFoundation的全部內容。