录制的音频无法在设备上播放,但无法在 iOS 模拟器上播放

Recorded audio fails to play on device but not iOS simulator

我正在使用 AVAudioRecorder 在一个视图控制器中录制音频,然后在另一个 table 中显示录制的音频

var numberOfRecords = 0

var recordingSession:AVAudioSession!
var audioRecorder:AVAudioRecorder!

@IBAction func recordAudio(_ sender: UIButton) {
// Check if we have an active audio recorder
if audioRecorder == nil {

    numberOfRecords = numberOfRecords + 1
    let filename = getDirectory().appendingPathComponent("\(numberOfRecords).m4a")
    let settings = [AVFormatIDKey: Int(kAudioFormatMPEG4AAC), AVSampleRateKey: 12000, AVNumberOfChannelsKey: 1, AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue]

    // Start audio recording
    do {
        audioRecorder = try AVAudioRecorder(url: filename, settings: settings)
        print(filename)
        audioRecorder.delegate = self
        audioRecorder.record()
    } catch {
        displayAlert(title: "Oops!", message: "Recording Failed")
    }
} else {
    // Stopping audio recording
    audioRecorder.stop()
    audioRecorder = nil
    UserDefaults.standard.set(numberOfRecords, forKey: "myNumber")
}

}

override func viewDidLoad() {
        super.viewDidLoad()

        // Record
        recordingSession = AVAudioSession.sharedInstance()
        if let number:Int = UserDefaults.standard.object(forKey: "myNumber") as? Int {
            numberOfRecords = number
        }
        AVAudioSession.sharedInstance().requestRecordPermission { (hasPermission) in
            if hasPermission {
            }
        }

    }

这是在第一个视图控制器中录制音频的代码,这是在第二个视图控制器中播放音频的代码

var audioPlayer:AVAudioPlayer!

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

let path = getDirectory().appendingPathComponent("\(indexPath.row + 1).m4a")
do {
    audioPlayer = try AVAudioPlayer(contentsOf: path)
    audioPlayer.prepareToPlay()
    audioPlayer.play()
} catch {
    print(error)
}

当我尝试在我的 iPhone 上播放它时,出现此错误:

Error Domain=NSOSStatusErrorDomain Code=1685348671 "(null)"

我已经遇到这个问题好几个星期了,但仍未找到解决方案。我在网上尝试了很多东西,比如更改 AVSampleRateKey,它保存的文件类型,但没有任何效果。我真的不知道我做错了什么。我不知道是不是我在一个视图控制器中录制并在另一个视图控制器中播放,但它只在 Xcode 模拟器而不是我的物理设备中播放音频。

要查看的更多代码:

do {
    try recordingSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
    try recordingSession.setActive(true)
    AVAudioSession.sharedInstance().requestRecordPermission { (hasPermission) in
        if hasPermission {
        }
    }
} catch {

}

我的猜测是您对音频会话处理不当。这 至关重要 。您必须 而不是 像那样保留对您的音频会话的引用;它不是一个东西,而是一个与媒体服务守护进程对话的管道。对于录制,您必须在会话上配置录制 类别,并且必须 激活 会话。要播放,请将您的类别更改为播放类别并激活 that 会话。