文件解压内存占用
我想在 iOS 上离线处理音频,但对内存使用情况有疑问。如果我使用 AVAssetReader 将 MP3 解压缩为原始 PCM 数据,内存占用将非常巨大。那么,如果解压缩会导致应用程序使用过多内存,我该如何处理(离线 FFT)mp3 文件呢?我想我必须以某种方式传输它,但我不知道如何在 iOS 中执行此操作。
I want to process audio offline on iOS, but have a query regarding memory usage. If I use AVAssetReader to decompress an MP3 to raw PCM data, the memory footprint would be huge. So how would I go about processing (offline FFT) an mp3 file if decompression would lead to the app using too much memory? I assume I have to stream it somehow, but I don't know how to do this in iOS.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
AVAssetReader 可以使用 AVAssetWriter 写入文件。
要获得 PCM,您可以编写 WAV 文件格式,然后在读取时跳过 RIFF 标头。然后,您只需根据 FFT 长度的需要,随时将 WAV 文件中的数据拉入内存即可。如果每个 FFT 的样本长度远远超过 100 万个样本,这只会导致内存占用问题。
您可以使用C/unix posix调用(fgetc等)在iOS下读取文件流。或者从 NSInputStream 读入 NSData。
AVAssetReader can write to a file using AVAssetWriter.
To get PCM, you can write a WAV file format, and then skip the RIFF header(s) on read. Then you only need to pull in as much data from the WAV file into memory at any one time as your FFT length requires. This should only cause a memory footprint problem if each FFT is well over 1 million samples long.
You can use C/unix posix calls (fgetc, etc.) to read a file stream under iOS. Or read from an NSInputStream into NSData.