見出し画像

iOSアプリ開発 入門 (14) - マイク音量の取得

マイク音量の取得の手順をまとめました。

・iOS14

前回

1. iOSのマイク音量の取得

iOSのマイク音量を取得するには、「AVCaptureSession」を使います。

2. UI

今回は、「UILabel」と「UIButton」を配置します。

画像1

3. Info.plist

マイク音量の取得を行うには、「NSMicrophoneUsageDescription」をInfo.plistに追加する必要があります。

4. コード

コードは、次のとおりです。

import UIKit
import Speech
import AVFoundation

// ViewController
class ViewController: UIViewController, AVCaptureAudioDataOutputSampleBufferDelegate {
    // UI
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!

    // マイク音量の取得
    let captureSession = AVCaptureSession()
    let captureQueue = DispatchQueue(label: "capture")
    var captureActive = false

    // ビューのロード時に呼ばれる
    override func viewDidLoad() {
        super.viewDidLoad()
      
        // キャプチャセッションの準備
        setupCaptureSession()
       
        // UI
        self.captureActive = false
        self.label.text = ""
        self.button.isEnabled = true
        self.button.setTitle("マイク音量取得の開始", for: .normal)
    }
   
    // キャプチャセッションの準備
    func setupCaptureSession() {
        let audioDevice: AVCaptureDevice! = AVCaptureDevice.default(for: AVMediaType.audio)
        let audioInput = try! AVCaptureDeviceInput(device: audioDevice)
        let audioDataOut = AVCaptureAudioDataOutput()
        audioDataOut.setSampleBufferDelegate(self, queue: self.captureQueue)
        captureSession.addInput(audioInput)
        captureSession.addOutput(audioDataOut)
    }
   
    // バッファ出力を通知
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer,
        from connection: AVCaptureConnection) {

        // マイク音量の平均値(dB) / マイク音量のピーク値(dB)
        var averagePowerLevel: Float = 0
        var peakHoldLevel: Float = 0
        for audioChannel in connection.audioChannels {
            averagePowerLevel += audioChannel.averagePowerLevel
            peakHoldLevel += audioChannel.peakHoldLevel
        }
        averagePowerLevel = averagePowerLevel/Float(connection.audioChannels.count)
        peakHoldLevel = peakHoldLevel/Float(connection.audioChannels.count)
       
        // ラベルに表示
        DispatchQueue.main.async {
            self.label.text = String(format: "%.2f/%.2f", averagePowerLevel, peakHoldLevel)
        }
    }
  
    // ボタンクリック時に呼ばれる
    @IBAction func onButtonClick(_ sender: UIButton) {
        // マイク音量取得の開始
        if (!self.captureActive) {
            // UI
            self.captureActive = true
            self.button.setTitle("マイク音量取得の停止", for: .normal)
            self.label.text = ""

            // マイク音量取得の開始
            self.captureSession.startRunning()
        }
        // マイク音量取得停止
        else {
            //UI
            self.captureActive = false
            self.button.setTitle("マイク音量取得の開始", for: .normal)
            
            // マイク音量取得の停止
            self.captureSession.stopRunning()
        }
    }
}

5. db (デシベル)

db (デシベル)については、以下が参考になります。

次回


この記事が気に入ったらサポートをしてみませんか?