iOS 8 录音重放出现 OSStatus error 1685348671 / 2003334207 问题的解决办法

本文介绍了在iOS8上实现录音并播放功能的方法。通过在录音前设置AVAudioSession为'AVAudioSessionCategoryPlayAndRecord'类别,并激活session,可以在真机上实现稳定的录音与回放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

许多录音类 APP 都提供录音回放功能,大家在做这类 APP 的时候也经常会遇到这个需求。当大家用以前的套路在 iOS 8 上录音的时候,在模拟器上跑得挺好的,但是一上真机就跪了,为什么?因为真机底层是真实的硬件,跟模拟器还是有一些差别的,例如真机支持硬件解码等等。

在 iOS 8 上,录音并播放需要在录音前就申请“录音并播放”的 session(swift):

func setSessionPlayAndRecord() {
    let session:AVAudioSession = AVAudioSession.sharedInstance()
    var error: NSError?
    if !session.setCategory("AVAudioSessionCategoryPlayAndRecord", withOptions: AVAudioSessionCategoryOptions.DefaultToSpeaker, error:&error) {
        println("could not set session category")
        if let e = error {
            println(e.localizedDescription)
        }
    }
    if !session.setActive(true, error: &error) {
        println("could not make session active")
        if let e = error {
            println(e.localizedDescription)
        }
    }
}

之后再开始录音,等录音结束后就可以正常播放啦。

 
 
 
 

转载于:https://www.cnblogs.com/Cheetah-yang/p/4669907.html

<think>好的,我现在需要解决用户的问题iOS应用从前台切换回来后录音没有声音的问题。用户已经尝试了一些方法,比如使用Audio Queues重写录音功能,并参考了GitHub上的示例代码和Apple的SpeakHere演示来处理中断通知。现在需要找到解决方案。 首先,我需要回忆一下iOS音频处理的相关知识。当应用进入后台时,系统可能会中断音频会话,导致录音停止。而当应用返回前台时,如果没有正确处理中断恢复,可能会出现没有声音的情况。用户提到的中断通知处理是关键点,可能在这里有遗漏或者配置不当的地方。 接下来,用户提到他们参考了SpeakHere示例代码来处理中断。我需要检查中断处理的部分,尤其是当应用从后台返回时,是否正确地恢复了音频队列。可能的步骤包括:在中断开始时暂停或停止录音,中断结束后重新激活音频会话,并重新配置或重启录音队列。 另外,音频会话(AVAudioSession)的配置是否正确也很重要。例如,是否需要设置适当的类别(如AVAudioSessionCategoryPlayAndRecord)和选项(如.allowBluetooth、.defaultToSpeaker等)。同时,确保在应用返回前台时重新设置音频会话的激活状态,并处理可能的中断恢复。 还要考虑是否有权限问题,比如麦克风权限在应用切换后是否被系统重置,但这种情况比较少见。更多可能是音频会话状态未正确恢复。 可能的解决方案步骤包括: 1. 检查音频会话的中断通知处理,确保在中断结束后重新激活会话并重启录音。 2. 验证音频会话的配置是否正确,包括类别和选项。 3. 在应用从后台返回前台时,重新激活音频会话并重新初始化录音队列。 4. 处理音频路由变化,确保输入设备正确连接。 需要查阅Apple的文档和相关示例,确认正确的处理流程。例如,当中断发生时,系统会发送AVAudioSessionInterruptionNotification,应该在处理该通知时保存状态,并在中断结束后恢复。同时,应用进入后台时可能需要暂停录音,返回前台时重新开始,但用户的问题可能出现在恢复时没有正确重启设备。 可能还需要检查是否有未处理的异常或错误,导致录音队列无法正确重启。例如,在中断恢复时,是否需要重新创建音频队列或重新配置缓冲区。 现在,我需要将这些思路整理成结构化的步骤,确保覆盖中断处理、会话激活、队列重启等方面,同时参考用户提到的SpeakHere示例和Audio Queue Services的正确用法。</think>### 解决方案:iOS应用恢复前台后录音无声问题 #### 1. **检查音频会话中断通知处理** - 在应用进入后台时,系统会触发音频中断(`AVAudioSessionInterruptionTypeBegan`),此时应暂停或停止录音。 - 当应用返回前台时,需监听中断结束事件(`AVAudioSessionInterruptionTypeEnded`),并重新激活音频会话。示例代码: ```swift NotificationCenter.default.addObserver(forName: AVAudioSession.interruptionNotification, object: nil, queue: nil) { notification in guard let userInfo = notification.userInfo, let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt, let type = AVAudioSession.InterruptionType(rawValue: typeValue) else { return } if type == .began { // 暂停录音 audioQueue.pause() } else { // 恢复录音前检查会话是否可激活 do { try AVAudioSession.sharedInstance().setActive(true) audioQueue.start() // 重启录音队列 } catch { print("恢复失败: \(error)") } } } ``` [^1] #### 2. **验证音频会话配置** - 使用`AVAudioSessionCategoryPlayAndRecord`类别以支持录音和播放: ```swift do { try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [.allowBluetooth, .defaultToSpeaker]) try AVAudioSession.sharedInstance().setActive(true) } catch { print("音频会话配置失败: \(error)") } ``` - **选项说明**:`.defaultToSpeaker`可避免切换到听筒模式导致无声。 #### 3. **处理应用前后台切换** - 在`AppDelegate`中监听`willEnterForegroundNotification`,重新激活音频会话并重启录音: ```swift NotificationCenter.default.addObserver(self, selector: #selector(resumeRecording), name: UIApplication.willEnterForegroundNotification, object: nil) @objc func resumeRecording() { do { try AVAudioSession.sharedInstance().setActive(true) audioQueue.start() // 重启录音队列 } catch { print("前台恢复失败: \(error)") } } ``` #### 4. **检查音频路由变化** - 监听音频路由变更通知(`AVAudioSession.routeChangeNotification`),处理设备插拔或切换: ```swift NotificationCenter.default.addObserver(forName: AVAudioSession.routeChangeNotification, object: nil, queue: nil) { notification in guard let reasonValue = notification.userInfo?[AVAudioSessionRouteChangeReasonKey] as? UInt, let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else { return } if reason == .oldDeviceUnavailable { // 耳机拔出时切换回扬声器 try? AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker) } } ``` #### 5. **验证录音队列的重启逻辑** - 如果使用`AudioQueue`,中断恢复后需确保缓冲区重新初始化: ```c OSStatus status = AudioQueueStart(audioQueue, NULL); if (status != noErr) { // 重启失败时尝试重建队列 [self recreateAudioQueue]; } ``` --- ### 相关问题 1. **如何检测iOS音频会话中断的具体原因?** > 通过解析`AVAudioSessionInterruptionNotification`中的`userInfo`字段,可获取中断类型和选项(如是否可恢复)。 2. **录音时如何避免蓝牙设备切换导致的无声?** > 在音频会话配置中启用`.allowBluetooth`选项,并监听路由变化通知以动态调整输出路径。 3. **为什么录音恢复后会出现数据丢失?** > 中断恢复时未正确保留缓冲区状态,需在中断开始时保存未完成的录音数据,并在恢复后拼接[^2]。 --- 通过以上步骤,可系统性排查并解决iOS应用从后台返回前台后录音无声的问题。核心在于正确处理音频会话中断、重新激活会话,并确保硬件资源正确分配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值