録音レベルの値が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}
回答1件
あなたの回答
tips
プレビュー