我无法使用 AVAudioEngine 录制
Posted
技术标签:
【中文标题】我无法使用 AVAudioEngine 录制【英文标题】:I can't record using AVAudioEngine 【发布时间】:2019-03-05 09:12:42 【问题描述】:AVAudiosession.sharedInstance().setCategory(.playAndRecord, mode: .default)
我可以使用上面的代码进行录制。 但是,在播放过程中,只有 iPhone 顶部的扬声器会发出声音。
所以我想在选项中添加defaultToSpeaker
。
但是,添加它不会记录。
有解决办法吗? 请帮帮我。
这是我写的代码。
final class RecordEngine
private var engine: AVAudioEngine!
private var mixer: AVAudioMixerNode!
private var player: AVAudioPlayerNode!
private var outputFile: AVAudioFile!
let session = AVAudioSession.sharedInstance()
init()
prepareAVAudioSession()
prepareNodes()
prepare()
func start()
try! engine.start()
func stop()
engine.pause()
engine.reset()
private func prepareAVAudioSession()
do
// try session.setCategory(.playAndRecord, mode: .default, options: [.allowBluetooth, .allowBluetoothA2DP])
try session.setCategory(.playAndRecord, mode: .default, options: .defaultToSpeaker)
try session.setActive(true)
catch
private func prepareNodes()
engine = AVAudioEngine()
mixer = AVAudioMixerNode()
player = AVAudioPlayerNode()
engine.attach(mixer)
engine.attach(player)
private func prepare()
let input = engine.inputNode
let mainMixer = engine.mainMixerNode
let format = input.outputFormat(forBus: 0)
engine.connect(player, to: mainMixer, format: format)
engine.connect(input, to: mixer, format: format)
engine.prepare()
func startRecord()
start()
let format = mixer.outputFormat(forBus: 0)
let outputFileURL = URL(string: NSTemporaryDirectory() + "temp.caf")!
do
outputFile = try AVAudioFile(forWriting: outputFileURL, settings: format.settings)
catch
print(error)
mixer.installTap(onBus: 0, bufferSize: 1024, format: format) [weak self] buffer, when in
do
try self?.outputFile.write(from: buffer)
print(buffer)
catch
print(error)
func stopRecord()
mixer.removeTap(onBus: 0)
print(outputFile)
stop()
func startPlaying()
start()
player.scheduleFile(outputFile, at: nil)
print("complete")
player.play()
func pausePlaying()
player.pause()
【问题讨论】:
【参考方案1】:问题不在于defaultToSpeaker
,而在于混音器设置。你有一个没有输出的mixer
(你安装了一个水龙头)和mainMixerNode
。
你需要两个混音器吗?如果是这样,您可以将mixer
连接到mainMixer
:
engine.connect(mixer, to: mainMixer, format: format)
或删除mixer
并在任何地方使用mainMixer
,或某些不会产生反馈的第三个选项。
【讨论】:
将混音器连接到 mainMixer 时会发出啸叫声。以上是关于我无法使用 AVAudioEngine 录制的主要内容,如果未能解决你的问题,请参考以下文章
在 WatchOS 上使用 AVAudioEngine 录制时阻止播放
使用 AVAudioEngine 进行语音识别会在录制后阻止声音
AvaudioEngine - 以特定采样率录制语音 AvaudioEngine for Analysis
如何使用 8000 PCM 格式的 AVAudioEngine 录制和播放?