【发布时间】:2016-01-10 21:29:48
【问题描述】:
我正在注销 xcode 命令行项目中音频单元渲染回调的原始数据。我从 iodata 参数中获取数据并注销这些缓冲区中的第一个“float32”字节信息,如下所示:
Float32 someDataL = *(Float32*)(player->inputBuffer->mBuffers[0].mData);
Float32 someDataR = *(Float32*)(player->inputBuffer->mBuffers[1].mData);
printf("L: %.2f || R: %.2f \n", someDataL,someDataR);
这个问题是关于如何在控制台中控制这些内存缓冲区的输出。这些缓冲区的第一个 float32 字节中包含的数据是 16 位深度 pcm 音频样本,因此范围在 -32768 和 + 32768 之间。我的控制台输出不稳定,因为有时有一个“-”符号,有时没有。因此,IT 使我很难进行分析,因为日志正在左右移动。例如
L: -0.00 || R: -0.00
L: -0.00 || R: -0.00
L: 0.00 || R: 0.00
L: 0.00 || R: 0.00
L: -0.00 || R: -0.00
L: -0.00 || R: -0.00
L: -0.00 || R: -0.00
L: -0.00 || R: -0.00
L: -0.00 || R: -0.00
有没有办法控制原木的宽度,使它们始终相等?
【问题讨论】:
-
这个
player->inputBuffer->mBuffers既丑陋又危险! -
*(Float32*)...是遇到麻烦的好方法。如果你有一个float缓冲区,请将其设为float,但不要只是重新解释转换。 -
我很欣赏建设性的批评,但 player->inputBuffer->mBuffers 有什么问题?它实际上在我正在阅读的整本书中都使用过。例如,最初分配这些缓冲区的代码是 for(UInt32 i =0; iinputBuffer->mNumberBuffers ; i++) { player->inputBuffer->mBuffers[i].mNumberChannels = 1;播放器->inputBuffer->mBuffers[i].mDataByteSize = bufferSizeBytes;播放器->inputBuffer->mBuffers[i].mData = malloc(bufferSizeBytes); }
-
就浮动缓冲区而言,缓冲区被定义为声明它的核心音频结构中的 void* 字段。我只是将它转换为 float32 以便 C 可以取消引用该内存中的内容。默认情况下没有int,没有float。但是,音频流被格式化为包含浮点格式的 16 位样本。所以我只是想注销 pcm 的原始数据。
标签: c printf core-audio