我有一些代码可以通过首先将所有音频文件数据放入NSData变量来操作音频文件。但它有时崩溃,因为它使用了很多RAM
NSData *data1 = [NSData dataWithContentsOfFile: someFile];
我已经使用Instruments检查了所有内容是否正在发布以及RAM的使用方式,我发现它有时会在音频文件变大时崩溃。有没有办法以较小的位或闪存或任何其他方式存储数据,这将允许我使用大文件而不超过iPhone上的最大RAM。
我使用NSData的一件事就是连接2个这样的文件:
[data1 appendData: data2];
由于
答案 0 :(得分: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);
然后,你可以将每个较小的块存储在某个地方,并在连接后再用它做你想做的事。
这在我看来都是未经测试的,但似乎是合理的。
答案 1 :(得分:1)
有没有办法以较小的位或闪存或其他方式存储数据,这样我就可以使用大文件而不会超过iPhone上的最大RAM。
当然。问题比NSData
更基本 - 你通常不会将一组音频文件(完整地)加载到内存中,尤其是当设备内存很少时。甚至在osx上加载整个文件也是非典型的,在osx上你可以有足够的内存(除非知道文件非常小)。这就是为什么音频文件apis允许您以块读取和写入的原因(参考:ExtAudioFileRead
或AudioFileReadPackets
)。