###前提・実現したいこと
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) { } }
「inBufferに音データが収まっているよう」とのことですが、音データというのはどのように表現されているデータなのかご存知でしょうか?まずはその辺りをご確認されることをお勧めします。ググれば参考となるページは出てくると思いますが、音声をどのように表現しているのか、周波数とサンプリングレートはどのような関係があるのかなどを理解できるとよりコード自体の理解も深まるかと思います。ちなみにコードは```で囲っていただけるとありがたいです。
プログラムを```で囲む方法は知りませんでした。ご指摘ありがとうございます。音データの中身はどの様に表現されたデータは理解できませんでした。推測では音のチャンネル毎に音量、周波数、音色などが数値で表され、inBuffer内のどれかの配列に収まっているのだろうと推測しています。