[MY-AL] PB de détection du volume dans WebGL
Publié : 17 Oct 2018 12:51
Bonjour !
Dans mon prog, j'ai un personnage qui parle, en bougeant les lèvres en fonction du volume du son.
Ca fonctionne très bien en EXE.
Je passe le bazard en WEBGL pour les besoins du dev.
Le personnage ne détecte plus les variations de volume du son.
J'ai bien isolé le pb, c'est bien de là que ça vient. Mais pas moyen de trouver un code qui fonctionnerait en WebGL...
Voici mon code actuel, si quelqu'un peut jeter un coup d'oeil...
Merci beaucoup, bonne journée !
Aymeric
Dans mon prog, j'ai un personnage qui parle, en bougeant les lèvres en fonction du volume du son.
Ca fonctionne très bien en EXE.
Je passe le bazard en WEBGL pour les besoins du dev.
Le personnage ne détecte plus les variations de volume du son.
J'ai bien isolé le pb, c'est bien de là que ça vient. Mais pas moyen de trouver un code qui fonctionnerait en WebGL...
Voici mon code actuel, si quelqu'un peut jeter un coup d'oeil...
Code : Tout sélectionner
#pragma strict
var Acteur : GameObject;
var Noisegate = 0.05f;
var DelaiSilence = 0.2f;
private var startTimer = 0;
private var countTimer = 0f;
private var audiosrc : AudioSource;
private var freqData: float[];
private var nSamples: int = 256;
private var fMax = 24000;
private var mouth = 0f;
private var volume = 40;
private var frqLow = 200;
private var frqHigh = 800;
private var y0: float;
function BandVol(fLow:float, fHigh:float): float {
fLow = Mathf.Clamp(fLow, 20, fMax); // limit low...
fHigh = Mathf.Clamp(fHigh, fLow, fMax); // and high frequencies
// get spectrum: freqData[n] = vol of frequency n * fMax / nSamples
Acteur.GetComponent.<AudioSource>().GetSpectrumData(freqData, 0, FFTWindow.BlackmanHarris);
var n1: int = Mathf.Floor(fLow * nSamples / fMax);
var n2: int = Mathf.Floor(fHigh * nSamples / fMax);
var sum: float = 0;
// average the volumes of frequencies fLow to fHigh
for (var i=n1; i<n2; i++){
sum += freqData[i];
}
return sum / (n2 - n1 + 1);
}
function Start() {
freqData = new float[nSamples];
// démarrer la détection de lecture
audiosrc = Acteur.GetComponent.<AudioSource>();
}
function Update() {
if(audiosrc.isPlaying)
{
mouth = y0 + BandVol(frqLow,frqHigh) * volume;
if (mouth >= Noisegate)
{
startTimer = 0;
Acteur.SendMessage("Speak",1);
}
else
{
startTimer = 1;
}
if (startTimer==1)
{
countTimer += Time.deltaTime;
if (countTimer > DelaiSilence)
startTimer = 0;
countTimer = 0;
Acteur.SendMessage("Speak",0);
}
}
else
{
Acteur.SendMessage("Speak",-1);
}
}
function StopSound (){
audiosrc.Stop();
}
Aymeric