Bha*_*ela 9 audio core-audio sample-rate swift avaudioengine
我们正在开发一个从外部麦克风录制声音的项目。出于分析目的,我们需要大约 5k Hz 的采样率。
我们正在使用AvAudioEngine来录制语音。我们知道 Apple 设备希望能够以特定速率进行录制,因此我们使用AVAudioConverter来降低采样率。
但正如您所知,它与压缩类似,因此我们降低采样率越低,文件大小和文件持续时间影响相同。目前正在发生什么(如果我错了,请纠正我)。
问题
**问题是降低采样率、缩短文件长度及其对计算和分析的影响。例如,1小时的录音被降级为45分钟。所以假设如果我们对 5 分钟的时间间隔进行分析,就会出错
对此最好的解决方案是什么?**
询问
我们在互联网上进行了搜索,但我们无法弄清楚installTap上的缓冲区大小有何影响?在当前代码中,我们将其设置为2688。
谁能澄清一下吗?
代码
let bus = 0
let inputNode = engine.inputNode
let equalizer = AVAudioUnitEQ(numberOfBands: 2)
equalizer.bands[0].filterType = .lowPass
equalizer.bands[0].frequency = 3000
equalizer.bands[0].bypass = false
equalizer.bands[1].filterType = .highPass
equalizer.bands[1].frequency = 1000
equalizer.bands[1].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(commonFormat: .pcmFormatInt16,
sampleRate: 5000,
channels: 1,
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: 2688, 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)")
}
Run Code Online (Sandbox Code Playgroud)
期待结果
我们可以压缩缓冲区,但我们希望在输出文件中具有相同的记录持续时间。如果我们记录 10 分钟,输出文件应该有 10 分钟的数据。
数字化音频没有固有的持续时间,因为它可以以任何采样率播放。
为了使生成的文件的持续时间达到您的预期,每个阶段的采样率必须达到您的预期:录制、处理和播放。
我怀疑正在发生两种可能的事情之一:
A)您在 installtap 内收到的缓冲区的采样率不是您想象的那样......并且您正在转换错误的格式进行转换。
B) 您播放音频的采样率与您假设的采样率不同。(你怎么知道你的播放器正在以 5000hz 播放)?
为了检查这一点,您必须将过程分解为更小的部分并检查每个阶段的采样率。
| 归档时间: |
|
| 查看次数: |
349 次 |
| 最近记录: |