使用AudioToolBox将Wav文件保存到NSFileWrapper

时间:2012-10-31 16:23:22

标签: cocoa nsdata audiotoolbox nsfilewrapper extaudiofile

我已经使用AudioToolBox框架中的ExtAudioFileCreateWithURL和ExtAudioFileWrite将我的样本保存到文件中。但是现在我需要将它保存到NSFileWrapper,因为我现在正在使用NSDocument:

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError 

有没有办法将ExtAudioFileXXX函数与NSMutableData对象一起使用,所以我可以使用NSFileWrapper initRegularFileWithContents:(NSData*)contents方法?

删除代码以保存到文件(有效):

AudioStreamBasicDescription file_desc;
FillOutASBDForLPCM(file_desc, _sample_rate, _channel_count, 32, 32, true, false);
OSStatus rv = ExtAudioFileCreateWithURL(url, kAudioFileWAVEType, &file_desc, NULL, kAudioFileFlags_EraseFile, &fout);
if (rv == noErr){
    int buff_size = sizeof(AudioBufferList) + sizeof(AudioBuffer);
    AudioBufferList* bufferList = (AudioBufferList*)malloc(buff_size);
    bufferList->mNumberBuffers = 1;
    bufferList->mBuffers[0].mData = _samples;
    bufferList->mBuffers[0].mNumberChannels = _channel_count;
    bufferList->mBuffers[0].mDataByteSize = _channel_count * _frame_count * sizeof(float);
    ExtAudioFileWrite(fout, _frame_count, bufferList);
    free(bufferList);
    ExtAudioFileDispose(fout);
}

1 个答案:

答案 0 :(得分:0)

在大多数情况下,使用外部文件是最佳解决方案。请注意,NSData具有Uncached和Mapped文件的初始化程序。您显然希望在大多数情况下最小化I / O,同时不消耗大量内存(并且您必须密切关注缓存内存增长)。更进一步,考虑如何以这种重量资产(子NSFileWrappers,链接)的另一种方式表示文件包装器对象,因为文档的文件可能不是一个非常小的文件(例如单循环)。

如果内存不是问题(例如,您只处理小样本和有限文件和文档),那么可以使用AudioFileInitializeWithCallbacks,它适用于Wave(但不是全部)格式)。这允许您在内存中处理自己的缓冲区,用于表示内存中整个文件的连续分配。然后创建NSData表示很简单 - 只需监视内存使用情况并确保独占读/写访问。请注意,NSData不需要创建深层副本 - 并将其纳入您的设计中。在OS X上使用此选项显然会有更多的灵活性。在这种情况下,请确保您知道实际写了多少。很可能,一个好的基于磁盘的解决方案(上面)可以为你节省大量磁盘写入。

无论如何,这需要比大多数基于NSFileWrapper的实现更多的思考,因为每个文档的音频文件资产可能会很快超过100 MB。