我知道如何在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
答案 0 :(得分:0)
frameSize变量是什么?你能不相信数字框架吗?无论哪种方式,我都会检查inNumberFrames,frameSize和框架是否与转换一致。您还在上次转换时使用frameSize而不是帧。如果两个通道都受到影响,我猜你的转换器是错误的。
答案 1 :(得分:0)
我查看了音高变换功能的标题,看起来osamp参数是用于调用之间的过采样。因此,如果我正确读取这意味着您应该使用两个单独的音调移位器(每个通道一个)或通过将osamp更改为零而遭受质量损失。