我想以可视化方式使用用户在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个样本的值,并找到“最大”的样本并将其返回。然后,这将在检查器中显示。如果您听不懂我刚才说的话,请查看如何录制数字音频。了解它的基础并不太复杂。