2011-09-25 46 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); 

然后,可以将每个较小的块存储在某个位置,然后在连接后按照您的要求进行操作。

这一切都没有在我的最终测试,但它似乎是合理的。