gpt4 book ai didi

ios - 内存中的 AudioKit/DSP : Understanding the different between the size of uncompressed audio on disk vs.

转载 作者:搜寻专家 更新时间:2023-11-01 06:25:58 30 4
gpt4 key购买 nike

这是一个更通用的 RTFM DSP 问题,来自对音频制作和软件非常熟悉但对音频软件开发不熟悉的人,关于未压缩(wav、caf、aiff)文件(44.1 采样率,16位)在磁盘上,与此音频在内存中的实际浮点值。

例如,我有一个测试 WAV 文件,根据 MacOS,该文件为七分十四秒 (7:14),大小为 83.4 MB。

如果我将此文件导入我的项目并将文件作为 AKAudioFile 打开,然后检查 .floatChannelData 属性(这是一个包含两个数组的数组,一个用于每个 channel (立体声文件的两个标准)),这个文件特别是总共大约 2300 万个 float ,堆上大约 180 兆字节。这是有道理的,因为 Swift 中的标准 Float 对象是一个 32 位 float ,每个 float 8 个字节。

我知道大小,但是我希望至少在我的应用程序中能够使用接近 16 位的东西,我只是分析这个音频,而不是以任何方式处理它,甚至在一些基本的优化和防止之后深拷贝,任何超过 10 分钟左右的音频都会占用堆上的内存。

根据这个SO question有一些新颖的方法可以将 32 位转换为 16 位,但老实说,这对我想做的事情来说是错误的/矫枉过正的方法。举个例子,如果我只是简单地从我的 AKAudioFile引用 floatChannelData,它会自动向堆中添加大约 300 兆!即使没有复制、附加等......

对于更有经验的 DSP 音频开发人员,是否有任何资源可以为您的程序中的大型 float 提供良好的堆/堆栈管理? AudioKit 可以录制到 16 位吗?我目前正在用 C 和 C++ 进行处理,所以如果性能更高的话,我觉得在那里进行任何类型的数学或转换都很舒服。任何线索都非常感谢,谢谢!

最佳答案

AudioKit 使用各种需要 32 位 float 组格式数据的第 3 方 DSP 例程。当以特定方式引用这些数组或以特定方式作为参数传递时,Swift 会复制 Swift 数组。因此,如果您将基本的 Swift 编码技术与常见的 AudioKit API 结合使用,您可能会遇到大量内存使用问题。

另一种方法是不将 AudioKit API 与标准 Swift 数组一起使用,并仅在需要时将数据转换为 32 位。

例如,您可以内存映射 (mmap) 您的 WAVE 文件,这允许 iOS 根据需要将 16 位数据分页到 VM 系统中,而不是一次全部转换为 32 位 AudioKit 格式。然后使用 vDSP 仅根据需要将映射文件中的 16 位 WAVE 数据切片转换为更小的预分配 C float 组,这是调用 DSP 例程所需的最小值(可能与 AudioKit 内部使用的 C 代码相同) .在将(可变不安全原始)指针传递给 C 例程时,Swift 通常不会复制这些预分配的 C 数组。

这些技术可以让您的应用程序的内存占用量小得多,使用更少的 CPU 周期,并有助于防止您的应用程序快速耗尽 iOS 设备的电池。

关于ios - 内存中的 AudioKit/DSP : Understanding the different between the size of uncompressed audio on disk vs.,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54719072/

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