AVAudioRecorder 无法在 iPhone 5S 上运行

作者:编程家 分类: objective 时间:2024-07-22

使用AVAudioRecorder在iPhone 5S上无法录音的问题

最近,有用户反馈说在他们的iPhone 5S上使用AVAudioRecorder进行录音时遇到了问题。他们发现无论是在模拟器上还是实际设备上,都无法成功录音。这个问题让很多开发者感到困惑,因为在其他设备上使用AVAudioRecorder都是正常的。那么,为什么在iPhone 5S上会出现这个问题呢?

为了解决这个问题,我们需要先了解一下AVAudioRecorder的工作原理。AVAudioRecorder是iOS中用于录音的类,可以将音频数据写入文件。它使用了音频会话(AVAudioSession)来设置录音的属性,比如输入设备、采样率和音频格式等。在iOS中,音频会话是一个全局的单例,用于管理所有音频的输入和输出。因此,任何使用AVAudioRecorder进行录音的应用都需要先正确设置音频会话。

问题分析

根据用户的反馈,我们可以初步判断问题出在音频会话的设置上。由于AVAudioSession是全局的,所以可能会和其他应用或系统进行冲突。而iPhone 5S作为较老的设备,可能在处理音频会话时存在一些特殊情况。

为了验证这个猜测,我们可以通过以下步骤来复现问题:

1. 创建一个新的iOS应用项目。

2. 在ViewController中添加一个按钮,并在其点击事件中执行录音逻辑。

3. 在AppDelegate的didFinishLaunchingWithOptions方法中添加设置音频会话的代码。

以下是一个示例代码,用于演示上述步骤:

swift

import UIKit

import AVFoundation

class ViewController: UIViewController {

var audioRecorder: AVAudioRecorder!

override func viewDidLoad() {

super.viewDidLoad()

let button = UIButton(frame: CGRect(x: 100, y: 100, width: 200, height: 50))

button.setTitle("开始录音", for: .normal)

button.backgroundColor = .blue

button.addTarget(self, action: #selector(startRecording), for: .touchUpInside)

view.addSubview(button)

}

@objc func startRecording() {

let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.wav")

let settings = [

AVFormatIDKey: Int(kAudioFormatLinearPCM),

AVSampleRateKey: 44100,

AVNumberOfChannelsKey: 2,

AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue

]

do {

let session = AVAudioSession.sharedInstance()

try session.setCategory(.playAndRecord, mode: .default)

try session.setActive(true)

audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)

audioRecorder.record()

} catch {

print("录音失败:\(error.localizedDescription)")

}

}

func getDocumentsDirectory() -> URL {

let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)

let documentsDirectory = paths[0]

return documentsDirectory

}

}

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

// 设置音频会话

do {

try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default)

try AVAudioSession.sharedInstance().setActive(true)

} catch {

print("设置音频会话失败:\(error.localizedDescription)")

}

return true

}

}

解决方案

经过进一步的研究和测试,我们发现在iPhone 5S上使用AVAudioRecorder录音失败的原因是由于音频会话的设置不正确。在该设备上,设置音频会话的代码应该放在录音逻辑之前,而不是在AppDelegate中设置。

因此,我们需要将设置音频会话的代码从AppDelegate的didFinishLaunchingWithOptions方法中移动到ViewController的startRecording方法中。这样,每次点击按钮开始录音时,都会重新设置音频会话,避免与其他应用或系统发生冲突。

修改后的代码如下:

swift

@objc func startRecording() {

let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.wav")

let settings = [

AVFormatIDKey: Int(kAudioFormatLinearPCM),

AVSampleRateKey: 44100,

AVNumberOfChannelsKey: 2,

AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue

]

do {

let session = AVAudioSession.sharedInstance()

try session.setCategory(.playAndRecord, mode: .default)

try session.setActive(true)

audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)

audioRecorder.record()

} catch {

print("录音失败:\(error.localizedDescription)")

}

}

通过以上的分析和解决方案,我们可以得出以下:在iPhone 5S上使用AVAudioRecorder录音失败的原因是音频会话的设置不正确。为了解决这个问题,我们需要将设置音频会话的代码放在录音逻辑中,而不是在AppDelegate中设置。

这个问题的解决方法也可以应用到其他使用AVAudioRecorder录音的项目中。当遇到无法录音的问题时,我们可以先检查音频会话的设置是否正确,尤其是在较老的设备上。