Ios AVAudioRecorder仅适用于.record(持续时间:)

Ios AVAudioRecorder仅适用于.record(持续时间:),ios,swift,avfoundation,avaudiosession,avaudiorecorder,Ios,Swift,Avfoundation,Avaudiosession,Avaudiorecorder,在我的一生中,我一直无法使用record()方法让avaudiorecord正确录制声音。如果我使用录制(forDuration:)方法,我只能录制声音。我已经尝试过多种设备(iPhone8W/iOS 14、iPadAir(第七代)w/iOS 14、iPhone12迷你模拟器)。我还将构建目标从iOS 13更改为iOS 9,并在较旧的模拟器(iPhone8w/iOS 10)上进行了尝试 不管怎样,无论我的设备/iOS组合如何,行为都是一样的-停止录制时record()总是生成一个空的4kb音频文

在我的一生中,我一直无法使用
record()
方法让
avaudiorecord
正确录制声音。如果我使用
录制(forDuration:)
方法,我只能录制声音。我已经尝试过多种设备(iPhone8W/iOS 14、iPadAir(第七代)w/iOS 14、iPhone12迷你模拟器)。我还将构建目标从iOS 13更改为iOS 9,并在较旧的模拟器(iPhone8w/iOS 10)上进行了尝试

不管怎样,无论我的设备/iOS组合如何,行为都是一样的-停止录制时
record()
总是生成一个空的4kb音频文件。我已经研究了模拟器容器,并下载了设备容器来验证这一点。同样,
record(forDuration:)
将用实际录制的声音保存一个合适的音频文件

Xcode版本:12.3

罪犯代码:

func recordAudio() {
        let dirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
        let recordingName = "recordedVoice.m4a"
        let pathArray = [dirPath, recordingName]
        let filePath = URL(string: pathArray.joined(separator: "/"))
        
        let session = AVAudioSession.sharedInstance()
        try! session.setCategory(.playAndRecord, mode: .default, options: .defaultToSpeaker)
        try! session.setActive(true)
        
        try! self.audioRecorder = AVAudioRecorder(url: filePath!, settings: [:])
        self.audioRecorder.delegate = self
        self.audioRecorder.isMeteringEnabled = true
        self.audioRecorder.prepareToRecord()

        // Problematic section
        // I only use one of the following two lines, record() fails, record(forDuration:) works.
        self.audioRecorder.record()
        self.audioRecorder.record(forDuration: 5)
}

func stopRecord() {
        self.audioRecorder.stop()
        let audioSession = AVAudioSession.sharedInstance()
        try! audioSession.setActive(false)
}
record()
的静默故障-没有错误或崩溃

我刚刚发现了另一件有趣的事情。当我调用
audioRecorder.stop()
时,应用程序无法正确保存音频文件。无论我是使用
record()
还是
record(持续时间:)

我很困惑。感谢您的帮助

记录()的静默故障-没有错误或崩溃

在实例化
AVAudioRecorder
时,我得到一个
'fmt?
错误。提供设置字典可以修复它

let settings = [
    AVFormatIDKey: kAudioFormatMPEG4AAC,
    AVSampleRateKey: 44100,
    AVNumberOfChannelsKey: 1
]

try! self.audioRecorder = AVAudioRecorder(url: filePath!, settings: settings)
记录()的静默故障-没有错误或崩溃

在实例化
AVAudioRecorder
时,我得到一个
'fmt?
错误。提供设置字典可以修复它

let settings = [
    AVFormatIDKey: kAudioFormatMPEG4AAC,
    AVSampleRateKey: 44100,
    AVNumberOfChannelsKey: 1
]

try! self.audioRecorder = AVAudioRecorder(url: filePath!, settings: settings)