🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

2338閲覧

Swift4 AVFoundationについて

ai24cuz

総合スコア5

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

0クリップ

投稿2019/11/22 16:44

前提・実現したいこと

AVFoundationを用いて音を入力し、それを出力するアプリを作っているのですが、最後のfunc playActのelse以降の soundPlayer.stop()でエラーが出てしまいました。エラーを解決できる方がいましたら教えていただけると幸いです。

発生している問題・エラーメッセージ

Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

該当のソースコード

Swift4

1import UIKit 2import AVFoundation 3 4class ViewController: UIViewController, AVAudioRecorderDelegate, AVAudioPlayerDelegate { 5 6 7 @IBOutlet weak var recordButton: UIButton! 8 @IBOutlet weak var playButton: UIButton! 9 10 var soundRecorder : AVAudioRecorder! 11 var soundPlayer : AVAudioPlayer! 12 13 var fileName : String = "audioFile.m4a" 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 setupRecorder() 19 playButton.isEnabled = false 20 21 } 22 23 func getDocumentsDirector() -> URL { 24 let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) 25 return paths[0] 26 } 27 28 func setupRecorder(){ 29 let audioFilename = getDocumentsDirector().appendingPathComponent(fileName) 30 let recordSetting = [AVFormatIDKey : kAudioFormatAppleLossless, 31 AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue, 32 AVEncoderBitRateKey : 320000, 33 AVNumberOfChannelsKey : 2, 34 AVSampleRateKey : 44100.2] as [String : Any] 35 36 do { 37 soundRecorder = try AVAudioRecorder(url: audioFilename, settings: recordSetting) 38 soundRecorder.delegate = self 39 soundRecorder.prepareToRecord() 40 41 } catch { 42 print(error) 43 } 44 } 45 46 func setupPlayer(){ 47 let audioFilename = getDocumentsDirector().appendingPathComponent(fileName) 48 do { 49 soundPlayer = try AVAudioPlayer(contentsOf: audioFilename) 50 soundPlayer.delegate = self 51 soundPlayer.prepareToPlay() 52 soundPlayer.volume = 1.0 53 } catch { 54 print(error) 55 } 56 } 57 58 func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) { 59 playButton.isEnabled = true 60 } 61 62 func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 63 recordButton.isEnabled = true 64 playButton.setTitle("Play", for: .normal) 65 } 66 67 68 69 @IBAction func recordAct(_ sender: Any) { 70 if recordButton.titleLabel?.text == "Record" { 71 soundRecorder.record() 72 recordButton.setTitle("Stop", for: .normal) 73 playButton.isEnabled = false 74 } else { 75 soundRecorder.stop() 76 recordButton.setTitle("Record", for: .normal) 77 playButton.isEnabled = false 78 } 79 80 } 81 82 @IBAction func playAct(_ sender: Any) { 83 if recordButton.titleLabel?.text == "Play" { 84 playButton.setTitle("Stop", for: .normal) 85 recordButton.isEnabled = false 86 setupPlayer() 87 soundPlayer.play() 88 } else { 89 90 //ここでエラー発生 91 soundPlayer.stop() 92 93 playButton.setTitle("Play", for: .normal) 94 recordButton.isEnabled = false 95 } 96 97 98 } 99 100 101}

試したこと

Xcodeのマイクのアクセシビリティが許可されてないかと思い確認したが、xcodeの項目がそもそもなかった。
セキュリティとプライバシー>プライバシー>マイク

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

soundPlayerがnilになっているのが原因です。
setupPlayerが一度も呼ばれていないのではありませんか?

投稿2019/11/22 16:49

編集2019/11/23 00:35
eytyet

総合スコア803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ai24cuz

2019/11/22 16:58

回答ありがとうございます。 setupPlayerはエラーが発生している文の上のif文の中で呼ばれています。
eytyet

2019/11/22 17:00

ブレークポイントを貼って、実際に呼ばれているかを確認されましたか?
ai24cuz

2019/11/22 17:10

確認したところ、setupPlayerが呼び出されてないようです。
ai24cuz

2019/11/23 04:20

ビルドした際にコーンソール上にAddInstanceForFactory: No factory registered for idというのが表示されるのですが、これが原因の可能性はありますか?
eytyet

2019/11/23 08:45 編集

そのエラーが原因かどうかは私には分からないです。 もし、どなたかが作成されたサンプルかなにかを元にされているのなら、作者にお尋ねくださいね。 `var soundPlayer : AVAudioPlayer!`は、もともと`var soundPlayer = AVAudioPlayer()`だったんでしょうか。後者はインスタンスを作成しているので`soundPlayer`は使えますが、前者は作成していないので使えません。初期化段階のどこかで`soundPlayer = AVAudioPlayer()`としてインスタンスをいれたらいいんじゃないでしょうか。なお、正しいプログラマなら`var soundPlayer : AVAudioPlayer?`とするべきです。元になっているプログラムの作者の方はその程度の方だと思うので、他にもいろんな罠があると覚悟したほうがいいですよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問