質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

3547閲覧

swiftで一定以上の音量レベルを検知したら画像を表示するコードについて

konhyo1

総合スコア12

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

2クリップ

投稿2017/11/29 05:43

録音レベルの値が5.0以上なら画像(contents01)を表示するプログラムを調べながら作ったのですが、うまくいきません。エラーが出ないためどこが間違っているのかわからないのですがどなたか教えていただけるとありがたいです。

今現在実機でデバックしたところ真っ白な画面がでたまま何も起きません。パソコンで実行すると録音レベルの値は表示されているので音声は認識できていると思います。

以下はコード全体です

swift

1// 2// ViewController.swift 3// 4 5import UIKit 6import AVFoundation 7import AudioToolbox 8 9private func AudioQueueInputCallback( 10 inUserData: UnsafeMutableRawPointer?, 11 inAQ: AudioQueueRef, 12 inBuffer: AudioQueueBufferRef, 13 inSrartTime: UnsafePointer<AudioTimeStamp>, 14 inNumberPacketDescriptions: UInt32, 15 inPacketDescs: UnsafePointer<AudioStreamPacketDescription>?) { 16} 17 18class ViewController: UIViewController { 19 @IBOutlet weak var imageView: UIImageView! 20 21 // 音声入力用のキューと監視用タイマーの準備 22 var queue: AudioQueueRef! 23 var recordingTimer: Timer! 24 25 override func viewDidLoad() { 26 super.viewDidLoad() 27 28 // 録音レベルの検知を開始する 29 self.startUpdatingVolume() 30 } 31 32 override func viewDidDisappear(_ animated: Bool) { 33 super.viewDidDisappear(animated) 34 // 録音レベルの検知を停止する 35 self.stopUpdatingVolume() 36 } 37 38 // 以下の処理を実行したいタイミングでタイマーをスタートさせるだけで録音レベルが検知できる 39 40 // MARK: - 録音レベルを取得する処理 41 func startUpdatingVolume() { 42 // 録音データを記録するフォーマットを決定 43 var dataFormat = AudioStreamBasicDescription( 44 mSampleRate: 44100.0, 45 mFormatID: kAudioFormatLinearPCM, 46 mFormatFlags: AudioFormatFlags(kLinearPCMFormatFlagIsBigEndian | 47 kLinearPCMFormatFlagIsSignedInteger | 48 kLinearPCMFormatFlagIsPacked), 49 mBytesPerPacket: 2, 50 mFramesPerPacket: 1, 51 mBytesPerFrame: 2, 52 mChannelsPerFrame: 1, 53 mBitsPerChannel: 16, 54 mReserved: 0 55 ) 56 // オーディオキューのデータ型を定義 57 var audioQueue: AudioQueueRef? = nil 58 // エラーハンドリング 59 var error = noErr 60 // エラーハンドリング 61 error = AudioQueueNewInput( 62 &dataFormat, 63 AudioQueueInputCallback, 64 UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()), 65 .none, 66 .none, 67 0, 68 &audioQueue 69 ) 70 if error == noErr { 71 self.queue = audioQueue 72 } 73 AudioQueueStart(self.queue, nil) 74 75 var enabledLevelMeter: UInt32 = 1 76 AudioQueueSetProperty( 77 self.queue, 78 kAudioQueueProperty_EnableLevelMetering, 79 &enabledLevelMeter, 80 UInt32(MemoryLayout<UInt32>.size) 81 ) 82 83 self.recordingTimer = Timer.scheduledTimer( 84 timeInterval: 1 / 30, 85 target: self, 86 selector: #selector(self.detectVolume(timer:)), 87 userInfo: nil, 88 repeats: true 89 ) 90 self.recordingTimer?.fire() 91 } 92 93 // 録音レベル検知処理を停止 94 func stopUpdatingVolume() { 95 // Finish observation 96 self.recordingTimer.invalidate() 97 self.recordingTimer = nil 98 AudioQueueFlush(self.queue) 99 AudioQueueStop(self.queue, false) 100 AudioQueueDispose(self.queue, true) 101 } 102 var levelMeter = AudioQueueLevelMeterState() 103 @objc func detectVolume(timer: Timer) { 104 var propertySize = UInt32(MemoryLayout<AudioQueueLevelMeterState>.size) 105 106 AudioQueueGetProperty( 107 self.queue, 108 kAudioQueueProperty_CurrentLevelMeterDB, 109 &levelMeter, 110 &propertySize) 111 112 print(levelMeter.mPeakPower) 113 114 func setLabelText () { 115 if levelMeter.mPeakPower > 5.0 { 116 let image = UIImage(named: "contents01") 117 imageView.image = image 118 119 } 120} 121} 122}

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

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

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

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

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

fuzzball

2017/11/29 07:12

「録音レベルが5以上にならない」のか、「録音レベルは5以上になるけど画像が表示されない」のか、どちらでしょうか?
konhyo1

2017/11/29 07:13

「録音レベルは5以上になるけど画像が表示されない」状態です
fuzzball

2017/11/29 07:22

質問内のコードでは、画像をセットしている setLabelText() が呼ばれていないようですが、どこからか呼んでいますか?
guest

回答1

0

ベストアンサー

swift

1func setLabelText () { 2 if levelMeter.mPeakPower > 5.0 { 3 let image = UIImage(named: "contents01") 4 imageView.image = image 5 } 6}

の、関数定義部分を削除して、

swift

1if levelMeter.mPeakPower > 5.0 { 2 let image = UIImage(named: "contents01") 3 imageView.image = image 4}

でどうでしょうか?

投稿2017/11/29 07:24

fuzzball

総合スコア16733

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

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

konhyo1

2017/11/29 07:32

ご回答いただきありがとうございます。無事に解決いたしました。この問題で長い間悩んでいたので実行できて良かったです。本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問