Swift 4.2 AVAudio Thread 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь получить уровень звука для запуска действия, и я собираю следующий код, который строит ОК, но я получаю сообщение об ошибке «Поток 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.    }
}

}

...