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

Posted

技术标签:

【中文标题】录制的音频无法在设备上播放,但不能在 iOS 模拟器上播放【英文标题】:Recorded audio fails to play on device but not iOS simulator 【发布时间】:2017-12-17 23:01:54 【问题描述】:

我正在使用 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 模拟器中播放音频,而不是我的物理设备。

查看didload的更多代码:

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


【问题讨论】:

【参考方案1】:

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

【讨论】:

是的!!!这成功了!非常感谢你不知道这对我有多大帮助!lol 所以我设法通过在我的 viewDidLoad 中包含更多代码来让录制工作。我在底部的原始问题中添加了代码。它现在可以录制,但应用程序中的其他声音非常安静。 记住我说的后半部分。完成录制后,停用您的音频会话,将其类别更改为播放类别,然后再次激活。现在播放。

以上是关于录制的音频无法在设备上播放,但不能在 iOS 模拟器上播放的主要内容,如果未能解决你的问题,请参考以下文章

iOS 无法在扬声器上播放并将音频会话设置为录制

iOS:音频录制设置在模拟器中失败,但在我的设备上没有?

以编程方式在 iOS 中录制的音频无法在 Windows 中播放

使用Samsung录制的音频无法在iOS上播放

无法在 Android 中播放使用 AudioRecord 录制的 pcm 文件

IOs App 在模拟器上运行但在设备上崩溃(主要使用 AVFoundation)