AVAudioRecorder 从不录音

Posted

技术标签:

【中文标题】AVAudioRecorder 从不录音【英文标题】:AVAudioRecorder never records 【发布时间】:2017-06-03 01:51:26 【问题描述】:

我正在使用AVAudioRecorder 来录制人声。我的代码如下:

// Property of Class
var recorder:AVAudioRecorder?

func recordButtonTapped() 
    let audiosession = AVAudioSession.sharedInstance()
    do 
        try audioSession.setCategory(AVAudioSessionCategoryRecord)
        try audioSession.setActive(true)
        if audioSession.recordPermission() != .granted 
            audioSession.requestRecordPermission( (success) in
                self.startRecording()
            )
        
        else 
            self.startRecording()
        

     catch 
        print("Unable To Set Category")
    


func startRecording() 
    // libraryPathWith(media) just gets the path to the documents directory
    // Like so: Documents/MediaLibrary/Audio/<mediaID>.<mediaExtension>
    if let path = MMFileManager.libraryPathWith(media: self.media) 
        isRecording = true
        do 
            let settings = [
                AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
                AVSampleRateKey: 44100,
                AVNumberOfChannelsKey: 1,
                AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
            ]

            recorder = try AVAudioRecorder(url: path, settings: settings)

            recorder?.delegate = self

            if recorder!.prepareToRecord() 
                recorder?.record()
            
        
        catch 
            isRecording = false
        
    


func stopRecording() 
    self.recordingLabel.text = "Recording Complete"
    self.recordingLabel.textColor = UIColor.white
    if let rec = recorder 
        rec.stop()
        recorder = nil
    
    isRecording = false


AVAudioRecorderDelegate

func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) 
    print("RECORDED AUDIO SUCCESSFULLY \(flag)")

func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) 
    print("AUDIO RECORDER ERROR \(error?.localizedDescription)")


在我对 AVAudioRecorder 调用 stop 之后,audioRecorderEncodeErrorDidOccur 函数永远不会被调用,但 audioRecorderDidFinishRecording 函数会调用,但 flag 始终是 false。它打印出"RECORDED AUDIO SUCCESSFULLY false"

问题

当我使用上面的代码录制时,我确实将文件保存到我的文档目录中指定的位置。但是这个文件不是我可以播放的。它写入的是文本文件,而不是音频文件,因为我将扩展名指定为 .aac

为什么AVAudioRecorder 不录制音频?我如何让它这样做?

【问题讨论】:

【参考方案1】:

我是这样做的,先导入

AV基金会

并将 AVAudioRecorderDelegate 添加到您的 ViewController:

class RecordViewController: UIViewController, AVAudioRecorderDelegate

然后创建 AVAudioRecorder 的全局实例:

var audioRecorder : AVAudioRecorder!

然后我创建了一个开始录制的录制按钮:

@IBAction func playButton(_ sender: Any) 

    let dirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let recordingName = "voiceRecording.wav"
    let pathArray = [dirPath, recordingName]
    let filePath = URL(string: pathArray.joined(separator: "/"))

    let session = AVAudioSession.sharedInstance()
    try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker)

    try! audioRecorder = AVAudioRecorder(url: filePath!, settings: [:])
    audioRecorder.delegate = self
    audioRecorder.isMeteringEnabled = true
    audioRecorder.prepareToRecord()
    audioRecorder.record()

dirPath 查找将存储图像的目录。

recordingName将设置实际录制文件的名称

文件路径结合了最终位置的目录和recordingName

其余的几乎是不言自明的。

然后创建一个更简单的暂停按钮:

@IBAction func pauseButton(_ sender: Any) 

    audioRecorder.stop()
    let audioSession = AVAudioSession.sharedInstance()
    try! audioSession.setActive(false)

这应该可以解决您录制音频的方式。

【讨论】:

【参考方案2】:

如果您已验证您的网址具有“aac”扩展名,那么我怀疑您只是忘记在录音机上调用 stop()。这会导致一个未最终确定的文件。

同时在 catch 块中打印您的错误。

do
    try throwingFunc()
 catch 
    print(error)

【讨论】:

【参考方案3】:

问题在于stopRecording() 函数中的行。在对记录器stop() 的调用下方,我立即将AVAudioRecorder 实例分配给nil。这会在完成创建真实.aac文件的后处理之前解除分配并结束AVAudioRecorder

【讨论】:

以上是关于AVAudioRecorder 从不录音的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioRecorder 没有声音

iOS开发简记:录音AVAudioRecorder

AVAudioRecorder 设置录音开始时间

AvAudioRecorder 录音文件随机损坏

IOS 录音(AVAudioRecorder)

AVAudioRecorder 不保存录音