AVAudioRecorder Thread 1: EXC_BAD_ACCESS (код = 1, адрес = 0x0) - PullRequest
0 голосов
/ 11 сентября 2018

Я изучаю курс iOS в Udacity.Я не знаю, почему запустить этот код, как показано ниже.Будет показано сообщение потока 1: EXC_BAD_ACCESS (код = 1, адрес = 0x0) в строке try! audioRecorder = AVAudioRecorder(url: filePath!, settings: [:])

import UIKit
import AVFoundation

class RecordViewController: UIViewController, AVAudioRecorderDelegate {

    var audioRecorder = AVAudioRecorder()


    @IBOutlet weak var recordingLabel: UITextField!
    @IBOutlet weak var recordButton: UIButton!
    @IBOutlet weak var stopRecordingButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        stopRecordingButton.isEnabled = false

        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("viewWillAppear called")
    }


    @IBAction func recordAudio(_ sender: AnyObject) {
        recordingLabel.text = "Recording in Progress"
        stopRecordingButton.isEnabled = true
        recordButton.isEnabled = false

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

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

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


    @IBAction func stopRecording(_ sender: Any) {
        recordButton.isEnabled = true
        stopRecordingButton.isEnabled = false
        recordingLabel.text = "Tap to Record"

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


    }

    func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
        if flag{
            performSegue(withIdentifier: "stopRecording", sender: audioRecorder.url)
        }else {
            print("recording wasn't successful")

        }
    }
}

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вы используете неправильный API.

URL(string: - для строк, представляющих полный URL-адрес, включая схему (http://, ftp://, file://).

Правильный API для путей к файлам, начинающихся с косой черты: URL(fileURLWithPath.

Во-вторых NSSearchPathForDirectoriesInDomains и конкатенация компонентов пути вручную устарели. Используйте API, связанный с URL, это, кстати, устраняет ошибку.

let documentsURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let fileURL = documentsURL.appendingPathComponent("recordedVoice.wav")

Этот try! не может аварийно завершить работу, поскольку ОС всегда создает папку с документами, если она не существует.

Для API, который может действительно throw ошибок добавить обработку ошибок

do {

    try session.setCategory(AVAudioSessionCategoryPlayAndRecord, with:AVAudioSessionCategoryOptions.defaultToSpeaker)

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

} catch { print(error) }
0 голосов
/ 11 сентября 2018
i think you must use try like this AVAudioPlayer

var resourcePath = url  //your url
var objectData = Data(contentsOf: NSURL(string: resourcePath)!)
var error: Error!
do {
    audioPlayer = try AVAudioPlayer(objectData)
}
catch let error {
}
audioPlayer.numberOfLoops = 0
audioPlayer.volume = 1.0
audioPlayer.prepareToPlay()
if audioPlayer == nil {
    print("\(error.description)")
}
else {
    audioPlayer.play()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...