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

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

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

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

iPhone

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

Q&A

1回答

9273閲覧

swift マイク入力された音データの周波数や音量を取得・分析するコード

ddk

総合スコア8

Swift

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

iPhone

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

0グッド

1クリップ

投稿2017/09/22 09:25

編集2022/01/12 10:55

###前提・実現したいこと
swiftでiphoneのマイクから入力された音データをリアルタイムで取得・分析したいです。
音の周波数ごとの音量が検知できるコードがお分かりでしたら教えて頂きたいです。

現状は以下のソースコードでAudioQueueInputCallbackが呼び出され、inBufferに音データが収まっている様ですが、取り出し方法がわかりません。

swiftについては初心者ですので、勘違いしている箇所もあると思いますが、よろしくお願いいたします。

###該当のソースコード

import AudioToolbox import UIKit private func AudioQueueInputCallback( _ inUserData: UnsafeMutableRawPointer?, inAQ: AudioQueueRef, inBuffer: AudioQueueBufferRef, inStartTime: UnsafePointer<AudioTimeStamp>, inNumberPacketDescriptions: UInt32, inPacketDescs: UnsafePointer<AudioStreamPacketDescription>?) { /* ここでマイク入力されたデータを扱いたい*/ print(inBuffer); //??? } class ViewController: UIViewController { var queue: AudioQueueRef! var audioQueue: AudioQueueRef? = nil var timer: Timer! override func viewDidLoad() { super.viewDidLoad() self.startUpdatingVolume() } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) self.stopUpdatingVolume() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func startUpdatingVolume() { var dataFormat = AudioStreamBasicDescription( mSampleRate: 44100.0, mFormatID: kAudioFormatLinearPCM, mFormatFlags: AudioFormatFlags(kLinearPCMFormatFlagIsBigEndian | kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked), mBytesPerPacket: 2, mFramesPerPacket: 1, mBytesPerFrame: 2, mChannelsPerFrame: 1, mBitsPerChannel: 16, mReserved: 0) var error = noErr self.audioQueue = self.queue; error = AudioQueueNewInput( &dataFormat, AudioQueueInputCallback, UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()), .none, .none, 0, &self.audioQueue) if error == noErr { self.queue = audioQueue var bu :AudioQueueBufferRef?; AudioQueueAllocateBuffer(self.queue, 16000, &bu) //16000は何の値かは不明です AudioQueueEnqueueBuffer (self.queue, bu!, 0, nil) } AudioQueueStart(self.queue, nil) self.timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(ViewController.detectVolume(_:)), userInfo: nil, repeats: true) self.timer?.fire() } func stopUpdatingVolume() { self.timer.invalidate() self.timer = nil AudioQueueFlush(self.queue) AudioQueueStop(self.queue, false) AudioQueueDispose(self.queue, true) } func detectVolume(_ timer: Timer) { } }

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

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

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

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

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

t_obara

2017/09/29 01:48

「inBufferに音データが収まっているよう」とのことですが、音データというのはどのように表現されているデータなのかご存知でしょうか?まずはその辺りをご確認されることをお勧めします。ググれば参考となるページは出てくると思いますが、音声をどのように表現しているのか、周波数とサンプリングレートはどのような関係があるのかなどを理解できるとよりコード自体の理解も深まるかと思います。ちなみにコードは```で囲っていただけるとありがたいです。
ddk

2017/09/29 02:56

プログラムを```で囲む方法は知りませんでした。ご指摘ありがとうございます。音データの中身はどの様に表現されたデータは理解できませんでした。推測では音のチャンネル毎に音量、周波数、音色などが数値で表され、inBuffer内のどれかの配列に収まっているのだろうと推測しています。
guest

回答1

0

過去に類似の質問があるようですが確認しましたでしょうか。

この質問にある回答内でどのように取得できるか記述されています。

また、GitHubをMicrophoneやAudioで検索すると、様々な参考になるリポジトリが見つかると思います。

投稿2017/10/12 13:24

nakasho_dev

総合スコア2655

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

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

ddk

2017/10/17 12:45

ご回答ありがとうございます。リンクを参考にしてみたのですが、やはり理解することができませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問