有人注意到音频转换器服务在 iOS 11 上发生了内部变化吗?
Did anyone notice Audio Converter Services changed internally on iOS 11?
我的应用使用音频转换器服务将音频从 44.1 khz 转换为 48 khz(16 位线性单声道),使用 AudioConverterFillComplexBuffer。
将 iOS 升级到 11.0(或可能是 11.4)后,音频包含 "noises",这是由回调返回缓冲区 "edges" 处值为零的样本引起的(不确定是第一个还是最后一个样本)
有谁知道或注意到有什么变化吗?它多年来一直运行良好,并且在 运行 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 开始读取结果。一旦我对每个缓冲区都这样做,结果就是干净的
我的应用使用音频转换器服务将音频从 44.1 khz 转换为 48 khz(16 位线性单声道),使用 AudioConverterFillComplexBuffer。
将 iOS 升级到 11.0(或可能是 11.4)后,音频包含 "noises",这是由回调返回缓冲区 "edges" 处值为零的样本引起的(不确定是第一个还是最后一个样本)
有谁知道或注意到有什么变化吗?它多年来一直运行良好,并且在 运行 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 开始读取结果。一旦我对每个缓冲区都这样做,结果就是干净的