Как обсуждено здесь , ни AVAudioEngine
узлы микшера, ни отводы не будут выполнять преобразование скорости для вас. На самом деле, в вашем случае вместо того, чтобы выдавать или регистрировать ошибку, смеситель тихо (понятно?) Дает вам молчание.
Поскольку вы не можете использовать AVAudioMixerNode
для преобразования тарифов, вы можете заменить его на удобное AVAudioConverter
, убедившись, что вы установили правильный выходной формат AVAudioPlayerNode
, поскольку
При воспроизведении буферов существует неявное предположение, что буферы находятся на одном уровне.
частота дискретизации в качестве выходного формата узла.
Если вы этого не сделаете, вы можете услышать пропуски и / или звук со сдвигом высоты тона.
Вот так
let input = engine.inputNode
let bus = 0
let inputFormat = input.inputFormat(forBus: bus)
engine.attach(player)
let fmt = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 8000, channels: 1, interleaved: false)!
engine.connect(player, to: engine.mainMixerNode, format: fmt)
let converter = AVAudioConverter(from: inputFormat, to: fmt)!
input.installTap(onBus: bus, bufferSize: 1024, format: inputFormat) { (buffer, time) -> Void in
let inputCallback: AVAudioConverterInputBlock = { inNumPackets, outStatus in
outStatus.pointee = AVAudioConverterInputStatus.haveData
return buffer
}
let convertedBuffer = AVAudioPCMBuffer(pcmFormat: fmt, frameCapacity: AVAudioFrameCount(fmt.sampleRate) * buffer.frameLength / AVAudioFrameCount(buffer.format.sampleRate))!
var error: NSError? = nil
let status = converter.convert(to: convertedBuffer, error: &error, withInputFrom: inputCallback)
assert(status != .error)
print(convertedBuffer.format)
print(convertedBuffer.floatChannelData)
print(convertedBuffer.format.streamDescription.pointee.mBytesPerFrame)
self.player.scheduleBuffer(convertedBuffer)
}