Unity3d:检查麦克风输入音量

时间:2016-05-25 17:21:54

标签: c# unity3d

我想在可视化表示中使用用户在Unity3d中输入的麦克风音量。所以我想得到一个0到1之间的值,告诉用户有多大声。我去寻找一个脚本,但处理卷的部分无法正常工作,那部分是方法pod install。出于某种原因,LevelMax()永远不会高于0.我不知道micPosiotion除了这个之外真正做了什么:

http://docs.unity3d.com/ScriptReference/Microphone.GetPosition.html

有谁知道方法Microphone.GetPosition出了什么问题?我没有任何错误或任何错误。它正确找到我的麦克风,它正在工作。我测试了它。

这是代码:

LevelMax()

2 个答案:

答案 0 :(得分:4)

此脚本有效。我刚刚对它进行了测试,它将检查器中麦克风的峰值水平显示为变量testSound。你的问题出现了一些问题,导致它无法开始录制到音频录音中。这就是为什么总是返回micPosition小于零的原因。

我可以看到的唯一一点是Microphone.GetPosition(null)方法中的LevelMax。请尝试将其更改为Microphone.GetPosition(_device)

您可能还想尝试通过更改行中传递的索引(在InitMic方法中)来尝试浏览不同的音频设备:

 _device = Microphone.devices [0];

尝试将此更改为1,2,3等,看看您是否只是找到错误的音频设备。如果您有多个麦克风或没有使用默认麦克风,那么这可能就是问题所在。

另外,我认为你误解了数字音频的工作原理。 GetPosition获取麦克风正在录制的当前样本到音频片段(即最新的样本/当前样本)。这基本上意味着它获得了已记录的样本量。您正在以44.1Khz样本进行录制。这意味着每隔一秒检查音频441000次,并为该单个样本分配一个级别。这称为采样率,可以更改。例如,CD使用44.1kHz的采样率,而数字视频往往使用48kHz。记录样本的准确性由位深度定义(但您不必担心这一点)。例如,CD使用16位(需要抖动),而数字媒体使用24位(通常)。这一行:

int micPosition = Microphone.GetPosition(null)-(_sampleWindow+1);

说“找到我们在129个样本前记录的样本量”。然后,它迭代接下来的128个样本的值,找到“最响亮”的样本并返回它。然后在检查员中显示。如果您不理解我刚才所说的任何内容,那么请研究如何记录数字音频。理解它的基础知识并不太复杂。

答案 1 :(得分:0)

您应该查看此thread,但以下是可能对您有用的代码:

public class MicInput : MonoBehaviour {

        public static float MicLoudness;

        private string _device;

        //mic initialization
        void InitMic(){
            if(_device == null) _device = Microphone.devices[0];
            _clipRecord = Microphone.Start(_device, true, 999, 44100);
        }

        void StopMicrophone()
        {
            Microphone.End(_device);
        }


        AudioClip _clipRecord = new AudioClip();
        int _sampleWindow = 128;

        //get data from microphone into audioclip
        float  LevelMax()
        {
            float levelMax = 0;
            float[] waveData = new float[_sampleWindow];
            int micPosition = Microphone.GetPosition(null)-(_sampleWindow+1); // null means the first microphone
            if (micPosition < 0) return 0;
            _clipRecord.GetData(waveData, micPosition);
            // Getting a peak on the last 128 samples
            for (int i = 0; i < _sampleWindow; i++) {
                float wavePeak = waveData[i] * waveData[i];
                if (levelMax < wavePeak) {
                    levelMax = wavePeak;
                }
            }
            return levelMax;
        }



        void Update()
        {
            // levelMax equals to the highest normalized value power 2, a small number because < 1
            // pass the value to a static var so we can access it from anywhere
            MicLoudness = LevelMax ();
        }

        bool _isInitialized;
        // start mic when scene starts
        void OnEnable()
        {
            InitMic();
            _isInitialized=true;
        }

        //stop mic when loading a new level or quit application
        void OnDisable()
        {
            StopMicrophone();
        }

        void OnDestroy()
        {
            StopMicrophone();
        }


        // make sure the mic gets started & stopped when application gets focused
        void OnApplicationFocus(bool focus) {
            if (focus)
            {
                //Debug.Log("Focus");

                if(!_isInitialized){
                    //Debug.Log("Init Mic");
                    InitMic();
                    _isInitialized=true;
                }
            }      
            if (!focus)
            {
                //Debug.Log("Pause");
                StopMicrophone();
                //Debug.Log("Stop Mic");
                _isInitialized=false;

            }
        }
    }