我想以可视化方式使用用户在Unity3d中通过他/她的麦克风输入的音频音量。因此,我想获得一个介于0到1之间的值,用以说明用户的声音大小。我一直在寻找脚本,但是处理音量的部分无法正常工作,该部分是方法LevelMax()。出于某些原因,micPosiotion永远不会变得大于0。除了以下内容,我不知道Microphone.GetPosition的实际作用:

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

有人知道LevelMax()方法出了什么问题吗?我没有任何错误。它可以正确找到我的麦克风,并且可以正常工作。我测试了

这是代码:

using UnityEngine;
using System.Collections;

public class MicInput : MonoBehaviour{

    public float testSound;
    public static float MicLoudness;
    private string _device;
    private AudioClip _clipRecord = new AudioClip();
    private int _sampleWindow = 128;
    private bool _isInitialized;

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

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

    float LevelMax()
    {
        float levelMax = 0;
        float[] waveData = new float[_sampleWindow];
        int micPosition = Microphone.GetPosition (null) - (_sampleWindow + 1);
        if (micPosition < 0) {
            return 0;
        }
        _clipRecord.GetData (waveData, micPosition);
        for (int i = 0; i < _sampleWindow; ++i) {
            float wavePeak = waveData [i] * waveData [i];
            if (levelMax < wavePeak) {
                levelMax = wavePeak;
            }
        }
        return levelMax;
    }

    void Update()
    {
        MicLoudness = LevelMax ();
        testSound = MicLoudness;

    }

    void OnEnable()
    {
        InitMic ();
        _isInitialized = true;
    }

    void OnDisable()
    {
        StopMicrophone ();
    }

    void OnDestory()
    {
        StopMicrophone ();
    }

    void OnApplicationFocus(bool focus)
    {
        if (focus) {
            if (!_isInitialized) {
                InitMic ();
                _isInitialized = true;
            }
        }

        if (!focus) {
            StopMicrophone ();
            _isInitialized = false;
        }
    }

}

最佳答案

该脚本有效。我刚刚对其进行了测试,它在检查器中将麦克风的峰值水平显示为变量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个样本的值,并找到“最大”的样本并将其返回。然后,这将在检查器中显示。如果您听不懂我刚才说的话,请查看如何录制数字音频。了解它的基础并不太复杂。

09-26 18:06
查看更多