改变非交错浮动的间距

时间:2015-05-09 07:06:45

标签: ios objective-c cocoa-touch audio core-audio

我知道如何在CoreAudio中改变音频的音高,但出于某种原因,当我处理非交错数据时,我只能移动一个通道。如果我尝试移动左右声道,声音就会变得不稳定。我似乎无法理解为什么会这样做。

我在渲染回调中有这段代码:

        [output.outputDataSource output:output shouldFillAudioBufferList:ioData withNumberOfFrames:inNumberFrames];//<-puts audio file frames in ioData w/ EZAudio
        int channelCount = output.outputASBD.mFormatFlags & kAudioFormatFlagIsNonInterleaved ? ioData->mNumberBuffers : ioData->mBuffers[0].mNumberChannels;
        int frameSize = ioData->mBuffers[0].mDataByteSize / ((output.outputASBD.mBitsPerChannel/8) * channelCount);
        UInt32 frames = AEFloatConverterToFloat(_floatConverter,ioData,_floatBuffers,frameSize);
        float *left = ((float **) _floatBuffers)[0];
        float *right = ((float **) _floatBuffers)[1];
        smbPitchShift(0.5, frames, 1024, 4, 44100, left, left);
        smbPitchShift(0.5, frames, 1024, 4, 44100, right, right);//<- If I take this out the left side sounds okay. vice-versa
        AEFloatConverterFromFloat(_floatConverter, _floatBuffers, ioData, frameSize);

此外,音高变换功能在这里 - &gt; http://blogs.zynaptiq.com/bernsee/repo/smbPitchShift.cpp

2 个答案:

答案 0 :(得分:0)

frameSize变量是什么?你能不相信数字框架吗?无论哪种方式,我都会检查inNumberFrames,frameSize和框架是否与转换一致。您还在上次转换时使用frameSize而不是帧。如果两个通道都受到影响,我猜你的转换器是错误的。

答案 1 :(得分:0)

我查看了音高变换功能的标题,看起来osamp参数是用于调用之间的过采样。因此,如果我正确读取这意味着您应该使用两个单独的音调移位器(每个通道一个)或通过将osamp更改为零而遭受质量损失。