2011-07-13 73 views
4

我目前使用OpenAL玩遊戲音樂。它工作正常,但除了原始WAV文件之外,它不能工作。這意味着我最終會有一個〜9mb的配樂。AudioToolbox/OpenAL ExtAudioFile播放壓縮音頻

我是OpenAL的新手,我直接使用Apple的示例代碼(https://developer.apple.com/library/ios/#samplecode/MusicCube/Listings/Classes_MyOpenALSupport_h.html%23//apple_ref/doc/uid/DTS40008978-Classes_MyOpenALSupport_h-DontLinkElementID_9)來獲取緩衝區數據。

問題:有沒有什麼辦法可以修改這個函數,以便它讀取壓縮音頻並對其進行解碼?
我並不擔心音頻文件格式,只要它可以播放和壓縮(如mp3,aac,caf)即可。我想這樣做(顯然)的唯一原因是減小文件大小。

編輯:看來,這個問題並沒有像我用來獲取緩衝區的方法那麼多。 https://developer.apple.com/library/ios/#samplecode/MusicCube/Listings/Classes_MyOpenALSupport_h.html%23//apple_ref/doc/uid/DTS40008978-Classes_MyOpenALSupport_h-DontLinkElementID_9的功能使用AudioFileOpenURLAudioFileReadBytes。有什麼辦法可以讓框架爲我解碼音頻ExtAudioFileOpenURLExtAudioFileRead

我試過這裏的代碼:https://devforums.apple.com/message/10678#10678,但我不知道該怎麼做。我用來獲取緩衝區的函數是https://developer.apple.com/library/ios/#samplecode/MusicCube/Listings/Classes_MyOpenALSupport_h.html%23//apple_ref/doc/uid/DTS40008978-Classes_MyOpenALSupport_h-DontLinkElementID_9,我沒有真正修改它,所以這就是我需要建立的。

我已經開始賞金了,因爲我真的需要這個,希望有人能指出我正確的方向。

+0

你真的不得不用純粹的OpenAL來播放你的聲音嗎?你爲什麼不使用像CocosDenshion這樣的盒子,這將爲你節省大量的後顧之憂。 http://www.cocos2d-iphone.org/wiki/doku.php/cocosdenshion:faq –

回答

4

您將需要使用音頻服務來加載其他格式。請記住,OpenAL僅支持未壓縮的PCM數據,因此您加載的任何數據都需要在加載過程中解壓縮。

下面是一些代碼,可以加載的iOS支持的任何格式:如果要傳輸壓縮的電影配樂式音頻,使用AVAudioPlayer因爲它起到壓縮音頻直接從磁盤https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/ObjectAL/ObjectAL/Support/OALAudioFile.m

+0

如果我使用這個,我該如何引用/讚揚它? – Greg

+0

這是我自己的代碼。只需在您的信息來源的評論中留下原始鏈接,這就足夠了。 – Karl

+0

如果此源代碼在App Store上的iPhone應用程序中編譯完成? – Greg

0

您可以嘗試使用第三方庫,一個MP3 OGG加載到一個char *緩衝區,然後這個緩衝區的OpenAL。這將解決文件大小問題。

對於OGG,你應該找到自己的website

對於MP3的圖書館,我真的不知道在哪裏可以找到一個輕量級的庫,它可以這樣做。但是這應該存在。

3

您不需要任何第三方庫來打開歸檔文件。在AudioToolbox/AudioToolbox.h框架的幫助下,您可以打開並讀取.caf文件的數據,該文件在性能(解壓縮過程中的最小CPU影響)方面(通過比mp3或ogg更好)是一個非常好的選擇。所以,當數據到達OpenAL時,它已經是PCM,準備填充緩衝區。這裏是你如何能做到這一點的一些示例代碼:

-(void) prepareFiles:(NSString *) filePath{ 

    // get the full path of the file 
    NSString* fileName = [[NSBundle mainBundle] pathForResource:filePath ofType:@"caf"];  

    // open the file using the custom created methods (see below) 
    AudioFileID fileID = [self openAudioFile:fileName];  
    preparedAudioFileSize = [self audioFileSize:fileID]; 

    if (preparedAudioFile){ 
     free(preparedAudioFile); 
     preparedAudioFile = nil; 
    } 
    else{ 
     ; 
    } 
    preparedAudioFile = malloc(preparedAudioFileSize); 

    //read the data from the file into soundOutData var 
    AudioFileReadBytes(fileID, false, 0, &preparedAudioFileSize, preparedAudioFile); 
    //close the file  
    AudioFileClose(fileID); 
} 



-(AudioFileID)openAudioFile:(NSString*)filePath 
{ 
    AudioFileID fileID; 
    NSURL * url = [NSURL fileURLWithPath:filePath]; 
    OSStatus result = AudioFileOpenURL((CFURLRef)url, kAudioFileReadPermission, 0, &fileID); 

    if (result != noErr) { 
     NSLog(@"fail to open: %@",filePath); 
    } 
    else { 
     ; 
    } 
    return fileID; 
} 


-(UInt32)audioFileSize:(AudioFileID)fileDescriptor 
{ 
    UInt64 outDataSize = 0; 
    UInt32 thePropSize = sizeof(UInt64); 
    OSStatus result = AudioFileGetProperty(fileDescriptor, kAudioFilePropertyAudioDataByteCount, &thePropSize, &outDataSize); 
    if(result != 0) NSLog(@"cannot find file size"); 
    return (UInt32)outDataSize; 
} 
1

基於卡爾的答覆上面,我做這將打開一個文件,並給你回PCM音頻的緩衝器(適用於OpenAL的)最小的一個C++函數以及創建OpenAL聲音所需的所有信息(格式,採樣率,緩衝區大小等)。

你所需要的兩個文件在這裏: https://gist.github.com/ofTheo/5171369

希望它能幫助! theo