1

在 iOS 的音调发生器示例中:http: //www.cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html

我正在尝试在 iOS 中将一个短数组转换为 Float32。

        Float32 *buffer = (Float32 *)ioData->mBuffers[channel].mData;
        short* outputShortBuffer = static_cast<short*>(outputBuffer);

        for (UInt32 frame = 0, j=0; frame < inNumberFrames; frame++, j=j+2)
        {
            buffer[frame] =  outputShortBuffer[frame];
        }

由于某些原因,从扬声器播放时我听到了额外的噪音。我认为从short到Float32的转换有问题?

4

1 回答 1

2

就在这里。

考虑浮点样本的值范围是-1.0 <= Xn <= 1.0signed short-32767 <= Xn <= +32767。仅仅铸造将导致几乎所有样品的剪切。

所以考虑到这一点:

    Float32 *buffer = (Float32 *)ioData->mBuffers[channel].mData;
    short* outputShortBuffer = static_cast<short*>(outputBuffer);

    for (UInt32 frame = 0, j=0; frame < inNumberFrames; frame++, j=j+2)
    {
        buffer[frame] =  ((float) outputShortBuffer[frame]) / 32767.0f;
    }

[注意:这不是这样做的最佳方式]。

但是,您确定您的框架是单声道的吗?如果不是,这也可能是音频损坏的原因,因为您只会复制一个通道。

顺便说一句,为什么,如果您的输出缓冲区是floats,您是否始终没有使用它们?

于 2013-05-13T20:53:38.070 回答