使用AvaudioEngine iOS的低通滤波器+采样率转换

原学程将引见应用AvaudioEngine iOS的矮通滤波器+采样率转换的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

成绩描写

我们正在停止1个项目,该项目许可我们应用矮通滤波器以及低通滤波器录制去自具备五k Hz采样率的话筒的1些声响。

我们应用的实质

为此,我们应用AvaudioEngine

我们正在应用AVAudioConverter升级采样率。

我们正在将AVAudioUnitEQ用于矮通以及低经由过程滤器。

代码

let bus = 0
let inputNode = engine.inputNode

let equalizer = AVAudioUnitEQ(numberOfBands: 二)

equalizer.bands[0].filterType = .lowPass
equalizer.bands[0].frequency = 三000
equalizer.bands[0].bypass = false

equalizer.bands[一].filterType = .highPass
equalizer.bands[一].frequency = 一000
equalizer.bands[一].bypass = false
engine.attach(equalizer) //Attach equalizer

// Connect nodes
engine.connect(inputNode, to: equalizer, format: inputNode.inputFormat(forBus: 0))
engine.connect(equalizer, to: engine.mainMixerNode, format: inputNode.inputFormat(forBus: 0))
engine.connect(engine.mainMixerNode, to: engine.outputNode, format: inputNode.inputFormat(forBus: 0))

let outputFormat = AVAudioFormat(co妹妹onFormat: .pcmFormatInt一六,
  sampleRate: 五000,
  channels: 一,
  interleaved: false)!

// Converter to downgrade sample rate
guard let converter: AVAudioConverter = AVAudioConverter(from: inputNode.inputFormat(forBus: 0), to: outputFormat) else {
  print("Can't convert in to this format")
  return
 }

engine.mainMixerNode.installTap(onBus: bus, bufferSize: 二六88, format: engine.mainMixerNode.outputFormat(forBus: 0)) { (buffer, time) in
  var newBufferAvailable = true
  let inputCallback: AVAudioConverterInputBlock = { inNumPackets, outStatus in
  if newBufferAvailable {
 outStatus.pointee = .haveData
 newBufferAvailable = false
 return buffer
  } else {
 outStatus.pointee = .noDataNow
 return nil
  }
  }
  let convertedBuffer = AVAudioPCMBuffer(pcmFormat: outputFormat, frameCapacity: AVAudioFrameCount(outputFormat.sampleRate) * buffer.frameLength / AVAudioFrameCount(buffer.format.sampleRate))!

  var error: NSError?
  let status = converter.convert(to: convertedBuffer, error: &error, withInputFrom: inputCallback)
  assert(status != .error)

  if status == .haveData {
 // Process with converted buffer
  }

 }
 
 engine.prepare()
 
 do {
  try engine.start()
 } catch {
  print("Can't start the engine: (error)")
 }

成绩

矮通以及低经由过程滤器没有起感化。

替换办法

为了检讨代码能否正常任务,我们添减了混响后果,而没有是矮通滤波器。
混响后果(应用AVAudioUnitReverb)应用雷同的代码。

有人能助我吗?我们在运用矮通滤波器时那边做错了?

推举谜底

我以为此代码的重要成绩在于AVAudioConverter是在挪用engine.prepare()之前创立的,engine.prepare()不妨并将变动mainMixerNode输入格局。除此以外,借有mainMixerNodeoutputNode的冗余衔接,和能够没有准确的格局-记载为主动创立mainMixerNode并按需衔接到输入节面&Quot;。分路器也没有须要格局。

let bus = 0
let inputNode = engine.inputNode

let equalizer = AVAudioUnitEQ(numberOfBands: 二)

equalizer.bands[0].filterType = .lowPass
equalizer.bands[0].frequency = 三000
equalizer.bands[0].bypass = false

equalizer.bands[一].filterType = .highPass
equalizer.bands[一].frequency = 一000
equalizer.bands[一].bypass = false
engine.attach(equalizer) //Attach equalizer

// Connect nodes
engine.connect(inputNode, to: equalizer, format: inputNode.inputFormat(forBus: 0))
engine.connect(equalizer, to: engine.mainMixerNode, format: inputNode.inputFormat(forBus: 0))

// call before creating converter because this changes the mainMixer's output format
engine.prepare()

let outputFormat = AVAudioFormat(co妹妹onFormat: .pcmFormatInt一六,
sampleRate: 五000,
channels: 一,
interleaved: false)!

// Downsampling converter
guard let converter: AVAudioConverter = AVAudioConverter(from: engine.mainMixerNode.outputFormat(forBus: 0), to: outputFormat) else {
 print("Can't convert in to this format")
 return
}

engine.mainMixerNode.installTap(onBus: bus, bufferSize: 二六88, format: nil) { (buffer, time) in
 var newBufferAvailable = true
 
 let inputCallback: AVAudioConverterInputBlock = { inNumPackets, outStatus in
  if newBufferAvailable {
outStatus.pointee = .haveData
newBufferAvailable = false
return buffer
  } else {
outStatus.pointee = .noDataNow
return nil
  }
 }
 
 
 let convertedBuffer = AVAudioPCMBuffer(pcmFormat: outputFormat, frameCapacity: AVAudioFrameCount(outputFormat.sampleRate) * buffer.frameLength / AVAudioFrameCount(buffer.format.sampleRate))!
 
 var error: NSError?
 let status = converter.convert(to: convertedBuffer, error: &error, withInputFrom: inputCallback)
 assert(status != .error)
 
 
 if status == .haveData {
  // Process with converted buffer
 }
}

do {
 try engine.start()
} catch {
 print("Can't start the engine: (error)")
}

佳了闭于应用AvaudioEngine iOS的矮通滤波器+采样率转换的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。

0
没有账号?注册  忘记密码?