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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

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

Q&A

解決済

1回答

2237閲覧

swiftで一定以上の音量レベルを検知したらmp3を再生するコードについて

konhyo1

総合スコア12

iOS

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

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

0グッド

0クリップ

投稿2017/11/26 10:33

大学の自主制作グループ課題でタイトルのような機能を持ち合わせたiOSアプリを作ろうとしているのですが、エラーがたくさん出てしまい困っています。どなたか教えてくださると幸いです。
エラーは以下のとおりです。

Swift

1(l25) 2sound.data // → Data型、音データが入っている 3エラーメッセージ 4Expected declaration 5 6(l41) 7override func viewDidLoad() { 8エラーメッセージ 9'viewDidLoad()' has already been overridden 10 11(l128) 12self.statusImage.isHidden = (levelMeter.mPeakPower >= -1.0) ? false : true 13エラーメッセージ 14Value of type 'ViewController' has no member 'statusImage'

全体のコードは以下の通りです。

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 20 let sound = NSDataAsset(name: "imazinnza0") 21 sound.data // → Data型、音データが入っている 22 23 override func viewDidLoad() { 24 super.viewDidLoad() 25 // Do any additional setup after loading the view, typically from a nib. 26 } 27 28 override func didReceiveMemoryWarning() { 29 super.didReceiveMemoryWarning() 30 // Dispose of any resources that can be recreated. 31 } 32 33 // 音声入力用のキューと監視用タイマーの準備 34 var queue: AudioQueueRef! 35 var recordingTimer: Timer! 36 37 override func viewDidLoad() { 38 super.viewDidLoad() 39 // 録音レベルの検知を開始する 40 self.startUpdatingVolume() 41 } 42 43 override func viewDidDisappear(_ animated: Bool) { 44 super.viewDidDisappear(animated) 45 // 録音レベルの検知を停止する 46 self.stopUpdatingVolume() 47 } 48 49 // 以下の処理を実行したいタイミングでタイマーをスタートさせるだけで録音レベルが検知できる 50 51 // MARK: - 録音レベルを取得する処理 52 func startUpdatingVolume() { 53 // 録音データを記録するフォーマットを決定 54 var dataFormat = AudioStreamBasicDescription( 55 mSampleRate: 44100.0, 56 mFormatID: kAudioFormatLinearPCM, 57 mFormatFlags: AudioFormatFlags(kLinearPCMFormatFlagIsBigEndian | 58 kLinearPCMFormatFlagIsSignedInteger | 59 kLinearPCMFormatFlagIsPacked), 60 mBytesPerPacket: 2, 61 mFramesPerPacket: 1, 62 mBytesPerFrame: 2, 63 mChannelsPerFrame: 1, 64 mBitsPerChannel: 16, 65 mReserved: 0 66 ) 67 // オーディオキューのデータ型を定義 68 var audioQueue: AudioQueueRef? = nil 69 // エラーハンドリング 70 var error = noErr 71 // エラーハンドリング 72 error = AudioQueueNewInput( 73 &dataFormat, 74 AudioQueueInputCallback, 75 UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()), 76 .none, 77 .none, 78 0, 79 &audioQueue 80 ) 81 if error == noErr { 82 self.queue = audioQueue 83 } 84 AudioQueueStart(self.queue, nil) 85 86 var enabledLevelMeter: UInt32 = 1 87 AudioQueueSetProperty( 88 self.queue, 89 kAudioQueueProperty_EnableLevelMetering, 90 &enabledLevelMeter, 91 UInt32(MemoryLayout<UInt32>.size) 92 ) 93 94 self.recordingTimer = Timer.scheduledTimer( 95 timeInterval: 1 / 30, 96 target: self, 97 selector: #selector(self.detectVolume(timer:)), 98 userInfo: nil, 99 repeats: true 100 ) 101 self.recordingTimer?.fire() 102 } 103 104 // 録音レベル検知処理を停止 105 func stopUpdatingVolume() { 106 // Finish observation 107 self.recordingTimer.invalidate() 108 self.recordingTimer = nil 109 AudioQueueFlush(self.queue) 110 AudioQueueStop(self.queue, false) 111 AudioQueueDispose(self.queue, true) 112 } 113 var levelMeter = AudioQueueLevelMeterState() 114 @objc func detectVolume(timer: Timer) { 115 var propertySize = UInt32(MemoryLayout<AudioQueueLevelMeterState>.size) 116 117 AudioQueueGetProperty( 118 self.queue, 119 kAudioQueueProperty_CurrentLevelMeterDB, 120 &levelMeter, 121 &propertySize) 122 123 // 取得した録音レベルに応じてimageを切り替える 124 self.statusImage.isHidden = (levelMeter.mPeakPower >= -1.0) ? false : true 125 print(levelMeter.mPeakPower) 126 } 127 128 // 録音レベルの値によってmp3ファイル”imazinzza0”を鳴らす 129 func setLabelText () { 130 if levelMeter.mPeakPower > -40.0 { 131 132 class ViewController: UIViewController { 133 var player: AVAudioPlayer? 134 135 func tapBtn() { 136 if let sound = NSDataAsset(name: "imazinnza0") { 137 player = try? AVAudioPlayer(data: sound.data) 138 player?.play() // → これで音が鳴る 139 } 140 } 141 } 142 143 } 144 } 145} 146 147

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

(l25)
sound.data // → Data型、音データが入っている
エラーメッセージ
Expected declaration

エラーメッセージをWebで検索するとすぐにヒットすると思いますが、クラスに直接処理を書こうとしているからだと思われます。
そもそも sound.data だけの行に意味はないと考えます。

(l41)
override func viewDidLoad() {
エラーメッセージ
'viewDidLoad()' has already been overridden

エラーメッセージ通りです。
viewDidLoadが2回宣言されています。

(l128)
self.statusImage.isHidden = (levelMeter.mPeakPower >= -1.0) ? false : true
エラーメッセージ
Value of type 'ViewController' has no member 'statusImage'

エラーメッセージ通りです。
statusImageがViewControllerのメンバ変数として宣言されていません。

投稿2017/11/26 11:18

nakasho_dev

総合スコア2655

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

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

konhyo1

2017/11/26 11:48

エラーメッセージとアドバイスをもとに試行錯誤してみたらなんとかできました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問