gpt4 book ai didi

cocoa - 使用 AudioToolBox 将 Wav 文件保存到 FileWrapper

转载 作者:行者123 更新时间:2023-12-03 16:22:13 27 4
gpt4 key购买 nike

我使用 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);
}

最佳答案

在大多数情况下,使用外部文件是最佳解决方案。请注意,NSData 具有用于未缓存和映射文件的初始值设定项。显然,在大多数情况下,您会希望最大限度地减少 I/O,同时不消耗大量内存(并且您必须密切关注缓存内存的增长)。更进一步,考虑如何以另一种方式表示这些重要 Assets (子 NSFileWrappers、链接)的文件包装器对象,因为文档的文件可能不是一个非常小的文件(例如单个循环)。

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

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

关于cocoa - 使用 AudioToolBox 将 Wav 文件保存到 FileWrapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13162451/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com