当前位置: 首页 > 面试题库 >

AVAudioEngine下采样问题

慕学海
2023-03-14
问题内容

我对从麦克风获取的音频进行下采样时遇到问题。我正在使用AVAudioEngine通过以下代码从麦克风中采样:

assert(self.engine.inputNode != nil)
let input = self.engine.inputNode!

let audioFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 8000, channels: 1, interleaved: false)    
let mixer = AVAudioMixerNode()
engine.attach(mixer)
engine.connect(input, to: mixer, format: input.inputFormat(forBus: 0))

do {
    try engine.start()

    mixer.installTap(onBus: 0, bufferSize: 1024, format: audioFormat, block: {
            (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
        //some code here
    })

} catch let error {
    print(error.localizedDescription)
}

这段代码在iPhone 5s上非常有效,因为麦克风输入为8000Hz,并且缓冲区中充满了来自麦克风的数据。

问题是我希望能够从iPhone
6s(及更高版本)录制哪个麦克风以16000Hz录制的声音。奇怪的是,如果我将mixernode与引擎mainmixernode连接(使用以下代码):

engine.connect(mixer, to: mainMixer, format: audioFormat)

这实际上是有效的,并且我得到的缓冲区的格式为8000Hz,声音可以完美地降采样,唯一的问题是声音也从我不想要的扬声器中发出(如果我不连接它,缓冲区为空)。

有谁知道如何解决这个问题?

非常感谢任何帮助,意见或想法。


问题答案:

我只需将混音器的音量更改为0即可解决此问题。

mixer.volume = 0

这使我能够利用引擎主混音器的强大功能将任何采样率重新采样到所需的采样率,而不会听到直接从扬声器传出的麦克风反馈环路。如果有人需要任何澄清,请告诉我。

现在这是我的代码:

assert(self.engine.inputNode != nil)
let input = self.engine.inputNode!

let audioFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 8000, channels: 1, interleaved: false)    
let mixer = AVAudioMixerNode()
engine.attach(mixer)
engine.connect(input, to: mixer, format: input.inputFormat(forBus: 0))
mixer.volume = 0
engine.connect(mixer, to: mainMixer, format: audioFormat)

do {
    try engine.start()

    mixer.installTap(onBus: 0, bufferSize: 1024, format: audioFormat, block: {
        (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
        //some code here
    })

} catch let error {
    print(error.localizedDescription)
}


 类似资料:
  • 在分布式跟踪中,数据量可能非常高,因此采样可能很重要(您通常不需要导出所有spans以获得正在发生的情况)。Spring Cloud Sleuth具有Sampler策略,您可以实现该策略来控制采样算法。采样器不会停止生成跨度(相关)ids,但是它们确实阻止了附加和导出的标签和事件。默认情况下,您将获得一个策略,如果跨度已经处于活动状态,则会继续跟踪,但新策略始终被标记为不可导出。如果您的所有应用程

  • 我在JSR223采样器中有以下代码,我得到SSL证书错误。有什么办法可以做到禁用吗? JSR223脚本中的问题JSR223采样器,消息:javax.script.scriptException:javax.net.ssl.sslhandShakeException:sun.security.validator.validatoreXception:PKIX路径构建失败

  • 如果非周期马尔科夫链的状态转移矩阵P和概率分布$$pi(x)$$对于所有的i,j满足:$$pi(i)P(i,j) = pi(j)P(j,i)$$ 则称概率分布$$pi(x)$$是状态转移矩阵P的平稳分布。 在M-H采样中我们通过引入接受率使细致平稳条件满足。现在我们换一个思路。 从二维的数据分布开始,假设$$pi(x_1,x_2)$$是一个二维联合数据分布,观察第一个特征维度相同的两个点$$A(x

  • 问题内容: 嗨,我需要将wav音频文件的采样率从44.1kHz下采样到8kHz。我必须使用字节数组手动完成所有工作…这是出于学术目的。 我目前正在使用2个类(接收器和源)来弹出和推送字节数组。一切顺利,直到到达需要使用线性插值对数据块进行下采样的部分为止。 由于我是从44100降采样到8000 Hz,因此我该如何插入一个包含约128000000字节的字节数组?现在,我弹出5、6或7个字节,具体取决

  • 本文向大家介绍储层采样,包括了储层采样的使用技巧和注意事项,需要的朋友参考一下 水库采样是一种随机算法。在该算法中,从具有n个不同项的列表中选择k个项。 我们可以通过创建一个数组作为大小为k的容器来解决它。然后从主列表中随机选择一个元素,然后将该项目放置在容器列表中。一次选择一项时,下次将不再选择。但是他的方法无效,我们可以通过这种方法增加复杂性。 在存储库列表中,复制列表中的前k个项目,现在从列

  • 目前 SOFATracer 提供了两种采样模式,一种是基于 BitSet 实现的基于固定采样率的采样模式;另外一种是提供给用户自定义实现采样的采样模式。下面通过案例来演示如何使用。 本示例基于 tracer-sample-with-springmvc 工程;除 application.properties 之外,其他均相同。 基于固定采样率的采样模式 在 application.propertie