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

时间:2017-12-17 23:01:55

标签: ios swift xcode audio avaudioplayer

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

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模拟器中的音频而不是我的物理设备。

viewdidload的更多代码:

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

}

1 个答案:

答案 0 :(得分:1)

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