有人注意到iOS 11上的音频转换器服务内部发生了变化吗?

有人注意到iOS 11上的音频转换器服务内部发生了变化吗?,ios,core-audio,Ios,Core Audio,我的应用程序使用AudioConverterFillComplexBuffer,使用音频转换器服务将音频从44.1 khz转换为48 khz(16位线性单声道) 将iOS升级到11.0(或可能是11.4)后,音频包含“噪音”,这是由于回调在缓冲区的“边缘”返回值为零的样本造成的(不确定是第一个样本还是最后一个样本) 有人知道或注意到任何变化吗?多年来,它一直运行良好,在运行iOS 9.x的设备上仍然运行良好 这是我的设置: // prepare the formats // origin Aud

我的应用程序使用AudioConverterFillComplexBuffer,使用音频转换器服务将音频从44.1 khz转换为48 khz(16位线性单声道)

将iOS升级到11.0(或可能是11.4)后,音频包含“噪音”,这是由于回调在缓冲区的“边缘”返回值为零的样本造成的(不确定是第一个样本还是最后一个样本)

有人知道或注意到任何变化吗?多年来,它一直运行良好,在运行iOS 9.x的设备上仍然运行良好

这是我的设置:

// prepare the formats
// origin
AudioStreamBasicDescription  originFormat = {0};
FillOutASBDForLPCM(originFormat, 44100.00, 1, sizeof(SInt16)*8, sizeof(SInt16)*8, false, false, false);
originFormat.mFormatFlags |= kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;
originFormat.mReserved = 0;

// destination
AudioStreamBasicDescription  destFormat = {0};
FillOutASBDForLPCM(destFormat, 48000.0, 1, sizeof(SInt16)*8, sizeof(SInt16)*8, false, false, false);
destFormat.mFormatFlags |= kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;
destFormat.mReserved = 0;


// create a converter
AudioConverterRef audioConverter;
AudioConverterNew(&originFormat, &destFormat, &audioConverter);

我发现,采样率之间的转换过去更能容忍缓冲区边缘丢失的数据。 例如,如果您转换1024帧的缓冲区,并且需要将所有这些帧转换为新的采样率,但从未在缓冲区之前或之后提供采样,则apple会将数字四舍五入,以使噪声最小

但是,从iOS 11.4(或更高版本)开始,转换的缓冲区的第一帧非常接近于零(可能是因为转换器在第一个样本之前查找样本,但找不到任何样本)


解决办法是向有问题的缓冲区提供一些额外的样本。例如,为了转换1024个缓冲区,我向转换器发送了该范围前后大约100个样本(总共1224个),然后从样本号100开始读取结果。一旦我对每个缓冲区都这样做了,结果是干净的

我发现在采样率之间的转换过去更能容忍缓冲区边缘上丢失的数据。 例如,如果您转换1024帧的缓冲区,并且需要将所有这些帧转换为新的采样率,但从未在缓冲区之前或之后提供采样,则apple会将数字四舍五入,以使噪声最小

但是,从iOS 11.4(或更高版本)开始,转换的缓冲区的第一帧非常接近于零(可能是因为转换器在第一个样本之前查找样本,但找不到任何样本)

解决办法是向有问题的缓冲区提供一些额外的样本。例如,为了转换1024个缓冲区,我向转换器发送了该范围前后大约100个样本(总共1224个),然后从样本号100开始读取结果。一旦我对每个缓冲区都这样做,结果是干净的