【问题标题】:iOS AVAudioRecorder.record() returns false on deviceiOS AVAudioRecorder.record() 在设备上返回 false
【发布时间】:2018-09-11 15:28:04
【问题描述】:

AVAudioRecorder.record() 仅在授予系统警报的麦克风权限后第一次返回 true,而不是总是返回 false .在模拟器上.record() 总是返回true。 如何在第二次和其他应用程序启动时制作 AVAudioRecordenr 记录?

代码如下:

func startRecording() {
        let dirPath =  NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0] as String
        let recordName = "record.wav"
        self.audioURL = URL(fileURLWithPath: dirPath + "/" + recordName)
        let session = AVAudioSession.sharedInstance()
        let microPhoneStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.audio)
        print(microPhoneStatus)
            do {
                try session.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.default, options: AVAudioSession.CategoryOptions.duckOthers)
            } catch {
                print(error)
            }

            guard let recorder  = try? AVAudioRecorder(url: self.audioURL, settings: [:]) else {
                self.finishRecording(success: false)
                return
            }


            self.audioRecorder = recorder
            self.audioRecorder.isMeteringEnabled = true
            self.audioRecorder.delegate = self
            let prepare = self.audioRecorder.prepareToRecord()
            try! session.setActive(true, options: [])
            let record = self.audioRecorder.record()
    }

已经尝试添加NSMicrophoneUsageDescription 并从代码中请求AVAudioSession requestRecordPermission

【问题讨论】:

  • 有什么问题?
  • 问题是 - 如何在第二次和其他应用程序启动时制作 AVAudioRecorder 记录?
  • 在录制前删除旧文件有帮助吗? AVFoundation 通常不喜欢覆盖文件。
  • @RhythmicFistman 说得好,但仍然没有结果
  • 在模拟器中它工作正常,但我们必须设置 AVAudioSessionCategory 以使其在录制之前在设备上工作。有关解决方案,请查看stackoverflow.com/questions/56024134/…

标签: ios avfoundation avaudiorecorder


【解决方案1】:

在录制音频之前需要完成两件重要的事情。

  1. 应用需要声明为什么/如何录制是必要的。在Info.plist 中为Privacy - Microphone Usage Description 添加一个键,并带有良好的文字描述。

  2. 应用需要在每次调用AVAudioRecorder.record()之前请求明确的用户许可。实现类似的东西:

import AVFoundation

let session = AVAudioSession.sharedInstance()
session.setCategory(.playAndRecord, mode: .default)
session.setActive(true)
session.requestRecordPermission { granted in
    print(granted)
}

请注意,这是一个简化的示例。需要添加额外的 do/try/catch 错误处理,因为这些方法标记为 throws

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2021-09-15
    • 2022-01-16
    • 2019-07-15
    相关资源
    最近更新 更多