前提・実現したいこと
SwiftのXcode 11.5で録音アプリを作成しています。
録音の開始と停止は、問題なく機能しています。
しかし、録音した音源を再生しようとするとエラーが出てきました。
解決方法が分からず、質問するに至りました。
ご回答をよろしくお願いいたします。
発生している問題・エラーメッセージ
エラーメッセージ
Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
該当のソースコード
エラーは、括弧を除くと下から3行目にある「soundPlayer.stop()」で発生しました。
Swift
1 2 3 4import UIKit 5import AVFoundation 6 7class ViewController: UIViewController, AVAudioRecorderDelegate, AVAudioPlayerDelegate { 8 9 10 @IBOutlet weak var recordBTN: UIButton! 11 @IBOutlet weak var playBTN: UIButton! 12 13 var soundRecorder : AVAudioRecorder! 14 var soundPlayer : AVAudioPlayer! 15 16 var fileName : String = "audioFile.m4a" 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 // Do any additional setup after loading the view. 21 setupRecorder() 22 playBTN.isEnabled = false 23 } 24 25 func getDocumentsDirector() -> URL{ 26 let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) 27 return paths[0] 28 } 29 30 func setupRecorder(){ 31 let audioFilename = getDocumentsDirector().appendingPathComponent(fileName) 32 let recordSetting = [ AVFormatIDKey : kAudioFormatAppleLossless, 33 AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue, 34 AVEncoderBitRateKey : 32000, 35 AVNumberOfChannelsKey : 2, 36 AVSampleRateKey : 44100.2 ] as [String : Any] 37 do{ 38 soundRecorder = try AVAudioRecorder(url: audioFilename, settings: recordSetting) 39 soundRecorder.delegate = self 40 soundRecorder.prepareToRecord() 41 }catch{ 42 print(error) 43 } 44 } 45 func setupPlayer(){ 46 let audioFilename = getDocumentsDirector().appendingPathComponent(fileName) 47 do{ 48 soundPlayer = try AVAudioPlayer(contentsOf: audioFilename) 49 soundPlayer.delegate = self 50 soundPlayer.prepareToPlay() 51 soundPlayer.volume = 1.0 52 }catch{ 53 print(error) 54 } 55 } 56 57 func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) { 58 playBTN.isEnabled = true 59 } 60 61 func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 62 recordBTN.isEnabled = true 63 playBTN.setTitle("play", for: .normal) 64 } 65 66 @IBAction func recordAct(_ sender: Any) { 67 if recordBTN.titleLabel?.text == "Record"{ 68 soundRecorder.record() 69 recordBTN.setTitle("Stop", for: .normal) 70 playBTN.isEnabled = false 71 }else{ 72 soundRecorder.stop() 73 recordBTN.setTitle("Record", for: .normal) 74 playBTN.isEnabled = true 75 } 76 } 77 @IBAction func playAct(_ sender: Any) { 78 if recordBTN.titleLabel?.text == "Play"{ 79 playBTN.setTitle("Stop", for: .normal) 80 recordBTN.isEnabled = false 81 setupPlayer() 82 soundPlayer.play() 83 }else{ 84 soundPlayer.stop() 85 playBTN.setTitle("Play", for: .normal) 86 recordBTN.isEnabled = true 87 } 88 } 89} 90
試したこと
**soundPlayer.stop()**自体を消した場合は、エラーは無くなりますが、
音声を聞くことはできませんでした。
録音しているときは、Diskのデータ通信速度が192KB/sで維持されていました。
また、録音を停止すると、0KB/sになりました。
このことから、録音はできていると考えています。
var fileName : String = "audioFile.m4a"
と定めたものの、audioFile.m4aの保存場所が分からなかったので、
保存できているかは、明らかではありません。
また、再生ボタンを押すと、エラーが発生します。
補足情報(FW/ツールのバージョンなど)
Main.storyboard>View Controller Scene>View Controllerを押して、
Show the identity inspector(新聞か画像のようなマーク)>Custom Class>Inherit Module From Targetにはチェックが入っています。
回答2件
あなたの回答
tips
プレビュー