切換
舊版
前往
大廳
主題

Unity 程式功能(2) - 麥克風 音量取得

三角形 | 2020-10-04 22:47:13 | 巴幣 2 | 人氣 947

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent (typeof (AudioSource))]
public class GetMicrophone: MonoBehaviour {

    public AudioSource m_audioSource; // 用來錄音的

    public Microphone microphone; // 麥克風參數
    public string[] device; // 麥克風設備名稱
    public int devicePos = 0; // 設備位置
    public int minFreq = int.MaxValue, maxFreq = int.MinValue; // 取得麥克風的最小值以及最大值頻率

    public float volume;
    public float[] microphoneSamles;

    public float Volume {
        get {
            if (Microphone.IsRecording (device[devicePos])) {
                // 取得的樣本數量
                int sampleSize = 128;
                float[] samples = new float[sampleSize];
                int startPosition = Microphone.GetPosition (device[devicePos]) - (sampleSize + 1);
                // 得到資料
                this.m_audioSource.clip.GetData (samples, startPosition);
                microphoneSamles = samples;

                // Getting a peak on the last 128 samples
                float levelMax = 0;
                for (int i = 0; i < sampleSize; i++) {
                    float wavePeek = samples[i];
                    if (levelMax < wavePeek) {
                        levelMax = wavePeek;
                    }
                }
                return levelMax * 99;
            }
            return 0;
        }

    }

    private void Awake () {
        m_audioSource = GetComponent<AudioSource> ();
        device = Microphone.devices; // get device name

        // To warn if have no microphone detected
        if (device.Length == 0) { Debug.LogWarning ("No microphone input."); }
    }

    private void Start () {
        StartCaptureVoice ();
    }

    private void Update () {
        volume = Volume;
    }

    private void OnDestroy () {
        StopCaptureVoice ();
    }

    private void OnDisable () {
        StopCaptureVoice ();
    }

    private void StartCaptureVoice () {
        // get microphone frequency
        Microphone.GetDeviceCaps (device[devicePos], out minFreq, out maxFreq);
        // set audio source
        m_audioSource.clip = Microphone.Start (device[devicePos], true, 3599, maxFreq);
        m_audioSource.loop = true;
        m_audioSource.timeSamples = Microphone.GetPosition (device[devicePos]);
    }

    private void StopCaptureVoice () {
        if (!Microphone.IsRecording (device[devicePos])) {
            return;
        }
        Microphone.End (device[devicePos]);
        m_audioSource.Stop ();
    }

}

參考資料:
Unity Microphone 錄音時 檢測聲音大小 - IT閱讀
(https://www.itread01.com/content/1541861893.html)
Unity Microphone 录音时 检测声音大小 - gabo - 开发者的网上家园
(https://www.cnblogs.com/gabo/p/4421281.html)

[Unity手札]Microphone三部曲(一) — How to do | by Chris Lin | Medium
(https://medium.com/@chrislin1015/unity%E6%89%8B%E6%9C%AD-microphone%E4%B8%89%E9%83%A8%E6%9B%B2-%E4%B8%80-how-to-do-bc0b93d37abb)


創作回應

更多創作