Я пытаюсь получить уровень звука для запуска действия, и я собираю следующий код, который строит ОК, но я получаю сообщение об ошибке «Поток 1: Неустранимая ошибка: неожиданно обнаружил ноль при развертывании необязательного значения» при запуске на iPhoneХ (IOS 12).Значок ошибки в строке с «Recorder.prepareToRecord»
Помощь приветствуется.Код:
import Foundation
импорт UIKit импорт AVFoundation импорт CoreAudio
класс ViewController: UIViewController {var рекордер: AVAudioRecorder!var levelTimer = Timer ()
let LEVEL_THRESHOLD: Float = -10.0
override func viewDidLoad()
{
super.viewDidLoad()
print("viewDidLoad")
// Do any additional setup after loading the view, typically from a nib.
let documents = URL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0])
_ = documents.appendingPathComponent("record.caf")
let _: [String: Any] = [
AVFormatIDKey: kAudioFormatAppleIMA4,
AVSampleRateKey: 44100.0,
AVNumberOfChannelsKey: 2,
AVEncoderBitRateKey: 12800,
AVLinearPCMBitDepthKey: 16,
AVEncoderAudioQualityKey: AVAudioQuality.max.rawValue
]
//let audioSession = AVAudioSession.sharedInstance()
do
{
try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [])
}
catch
{
print(error)
}
do
{
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)
print("AVAudioSession")
}
catch
{
print(error)
}
recorder.prepareToRecord()
recorder.isMeteringEnabled = true
recorder.record()
levelTimer = Timer.scheduledTimer(timeInterval: 0.02, target: self, selector: #selector(levelTimerCallback), userInfo: nil, repeats: true)
}
@objc func levelTimerCallback()
{
recorder.updateMeters()
let level = recorder.averagePower(forChannel: 0)
let isLoud = level > LEVEL_THRESHOLD
print(level)
print(isLoud)// do whatever you want with isLoud
}
override func didReceiveMemoryWarning()
{
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated. }
}
}