我们正在进行一个从外部麦克风录制声音的项目。为了分析的目的,我们需要一个大约5k赫兹的采样率。
我们正在使用AvAudioEngine录制一个声音。我们知道苹果设备希望能够以特定的速度记录,所以我们使用AVAudioConverter来降低采样率。
但是,正如您所知道的,它类似于压缩,所以我们降低的样本率,文件大小和文件持续时间影响相同。这是目前正在发生的(如果我错了,请纠正我)。
问题
**问题是降低抽样率,缩短档案长度及其对计算和分析的影响。例如,一个小时的录音被降级到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)")
}期望结果
我们对缓冲区的压缩很好,但是我们希望在输出文件中有相同的记录时间。如果我们记录10分钟,输出文件应该有10分钟的数据。
发布于 2021-12-24 18:22:46
数字化音频没有一个固有的持续时间,因为它可以被回放任何样本率。
为了使结果文件的持续时间达到您预期的效果,样本速率必须是您在每个阶段所期望的:记录、处理和回放。
我怀疑有两种可能的事情正在发生:
( A)您在安装程序中接收到的缓冲区的采样率不是您所设想的那样.你正在从错误的格式转换。
( B)你的音频回放速度与你所假设的不同。(你怎么知道你的球员打5000小时)?
为了检查这一点,您必须将过程分解成较小的部分,并在每个阶段检查采样率。
https://stackoverflow.com/questions/70445373
复制相似问题