2011-09-25 20 views
2

我有一些操作音頻文件的代碼,首先將所有音頻文件數據放入NSData變量中。但它有時會崩潰,因爲它使用多少內存有效使用NSData

NSData *data1 = [NSData dataWithContentsOfFile: someFile]; 

我一直在使用這一切都被釋放,以及如何被使用的RAM中,我想通了,它只是崩潰有時當音頻文件是大儀器檢查。有沒有辦法將數據存儲在較小的位或閃存中或以其他任何方式存儲,這使我可以在不超過iPhone上最大RAM的情況下處理大文件。

使用NSData的例如有一件事IM是串聯2個文件是這樣的:

[data1 appendData: data2]; 

感謝

回答

1

是否有存儲在較小位或在閃光燈或將讓我處理大文件,不超過iPhone上的最大RAM任何其他方式的數據的方式。

當然。這個問題比NSData更基礎 - 你通常不會將一組音頻文件(全部)加載到內存中,特別是當設備的內存很少時。即使在osx上加載整個文件也是非常典型的,在這裏你可以擁有足夠的內存(除非該文件被認爲非常小)。這就是爲什麼音頻文件apis允許您讀取和寫入塊(參考:ExtAudioFileReadAudioFileReadPackets)。

+1

謝謝,沒有想到apis。我還沒有嘗試過,但從我看到它應該工作。 – user591375

+0

來自過去幾年寫過很多音頻程序的人:不要擔心,它會*工作(不只是*應該*)。別客氣 – justin

4

試試這個(從這個SO問題):

NSData* myBlob; 
NSUInteger length = [myBlob length]; 
NSUInteger chunkSize = 100 * 1024; 
NSUInteger offset = 0; 
do { 
    NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset; 
    NSData* chunk = [NSData dataWithBytesNoCopy:(void*)[myBlob bytes] + offset 
                                         length:thisChunkSize 
                                   freeWhenDone:NO]; 
    offset += thisChunkSize; 
    // do something with chunk 
} while (offset < length); 

然後,可以將每個較小的塊存儲在某個位置,然後在連接後按照您的要求進行操作。

這一切都沒有在我的最終測試,但它似乎是合理的。