AudioKit 5.3中AudioPlayer节点致采样率变为44.1kHz如何解决
AudioKit 5.3 全链路锁定48kHz采样率解决方案
你的判断是对的,麦克风链路正常是因为麦克风硬件枚举的原生格式为48kHz,会在引擎启动时自动把整个AudioKit引擎的处理采样率拉到48kHz;而纯文件播放的链路中,AudioPlayer默认会在引擎未锁定采样率时,匹配系统音频会话默认的44.1kHz做内部重采样,最终输出文件就会落到44.1kHz。
AudioKit 5.3的AudioPlayer没有独立的“关闭重采样”开关,它的重采样行为完全由链路各节点的格式配置、AVAudioSession的实际采样率决定,按以下步骤配置即可强制全链路跑在48kHz:
前置配置(必须在创建任何音频节点前完成)
先强制设置系统音频会话的首选采样率,并校验实际生效值,避免系统回落到44.1kHz:
let audioSession = AVAudioSession.sharedInstance() // 必须用playAndRecord分类,纯play分类在部分设备上会强制锁44.1kHz输出 try audioSession.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .mixWithOthers]) try audioSession.setPreferredSampleRate(48000) try audioSession.setActive(true) // 校验实际采样率,部分老旧设备/外接不支持48k的音频设备时会设置失败 guard audioSession.sampleRate == 48000 else { fatalError("当前环境无法启用48kHz采样率,实际生效值:\(audioSession.sampleRate)") }
引擎初始化配置
显式指定引擎内部连接格式,禁止引擎自动推导采样率:
let engine = AudioEngine() let targetFormat = AVAudioFormat(standardFormatWithSampleRate: 48000, channels: 2)! // 显式指定主混音节点到输出节点的连接格式 engine.connect(engine.mainMixerNode, to: engine.outputNode, format: targetFormat)
AudioPlayer配置
加载音频文件前显式指定AudioPlayer的处理格式,禁用默认的自动格式匹配逻辑:
let player = AudioPlayer() // 不要留空(默认nil会触发自动采样率匹配) player.format = targetFormat // 格式设置完成后再加载48kHz源文件 try player.load(url: your48kAudioFileURL)
NodeRecorder配置
初始化录制器时显式传入48kHz格式,不要依赖节点的自动输出格式:
// 按你的链路顺序连接节点:player -> 自定义处理节点 let customNode = YourCustomProcessNode() engine.connect(player, to: customNode, format: targetFormat) engine.connect(customNode, to: engine.mainMixerNode, format: targetFormat) // 初始化录制器,显式指定录制格式 let recorder = try NodeRecorder( node: customNode, file: nil, fileType: .wav, format: targetFormat ) // 所有节点连接、格式配置完成后再启动引擎 try engine.start()
校验配置生效
链路启动后可打印各节点的采样率确认无隐式重采样:
print("Player输出采样率:\(player.outputFormat(forBus: 0).sampleRate)") print("自定义节点输出采样率:\(customNode.outputFormat(forBus: 0).sampleRate)") print("录制器输入采样率:\(recorder.format.sampleRate)")
以上值全部为48000即为配置生效,AudioPlayer不会再触发自动重采样。
注意:所有格式配置、节点连接必须在
engine.start()调用前完成,引擎启动后再修改节点连接/格式会触发AudioKit内部的隐式重采样,导致采样率不符合预期。
内容的提问来源于stack exchange,提问作者Jim Gardens
相关产品推荐
相关产品推荐

