Qualcuno conosce un modo per ottenere l'ampiezza media di un file .wav usando C# (anche se ciò significa chiamare un programma da riga di comando esterno e analizzare l'output)? Grazie!Ampiezza media di un .wav in C#
risposta
Ecco uno snip che legge in un wav stereo e inserisce i dati in due array. E 'non provato perché ho dovuto togliere un po' di codice (la conversione in mono e calcolare una media mobile)
/// <summary>
/// Read in wav file and put into Left and right array
/// </summary>
/// <param name="fileName"></param>
private void ReadWavfiles(string fileName)
{
byte[] fa = File.ReadAllBytes(fileName);
int startByte = 0;
// look for data header
{
var x = 0;
while (x < fa.Length)
{
if (fa[x] == 'd' && fa[x + 1] == 'a' &&
fa[x + 2] == 't' && fa[x + 3] == 'a')
{
startByte = x + 8;
break;
}
x++;
}
}
// Split out channels from sample
var sLeft = new short[fa.Length/4];
var sRight = new short[fa.Length/4];
{
var x = 0;
var length = fa.Length;
for (int s = startByte; s < length; s = s + 4)
{
sLeft[x] = (short)(fa[s + 1] * 0x100 + fa[s]);
sRight[x] = (short)(fa[s + 3] * 0x100 + fa[s + 2]);
x++;
}
}
// do somthing with the wav data in sLeft and sRight
}
Se il file wav è mono, sarei in grado di commentare solo sRight [x] = (breve) (fa [s + 3] * 0x100 + fa [s + 2]); linea e cambia s = s + 4 a s = s +2? Non ho molta familiarità con il formato wav. Grazie! – BarrettJ
Neanche io, ma penso che potresti semplicemente saltare sRight. – Nifle
Apportare le modifiche che ho elencato sopra e dichiarare sLeft come "var sLeft = new short [fa.Length/2];" funziona davvero per i file mono. – BarrettJ
Normalmente il metodo root-mean-squared viene utilizzato per calcolare l'ampiezza "media" dei segnali sin (x) -like.
La libreria NAudio per .NET suona come la soluzione migliore. Consente l'accesso alla forma d'onda di un file audio, che può eseguire il looping per calcolare il valore dell'ampiezza media.
dimenticato di dire che il wav è mono, se questo fa la situazione più facile/diverso. – BarrettJ