2012-05-02 17 views
7

He estado luchando con esto desde hace bastante tiempo y no pude encontrar una solución funcional.La manera más fácil de leer muestras de 2 canales en una matriz de WaveStream

Tengo un archivo wav (PCM de 16 bits: 44kHz 2 canales) y quiero extraer muestras en dos arreglos para cada uno de los dos canales. Hasta donde sé, el método directo para esto no existe en la biblioteca de NAudio, así que traté de ejecutar el siguiente código para leer algunas muestras entrelazadas, pero la matriz de buffer permanece vacía (solo un montón de ceros):

using (WaveFileReader pcm = new WaveFileReader(@"file.wav")) 
{ 
    byte[] buffer = new byte[10000]; 
    using (WaveStream aligned = new BlockAlignReductionStream(pcm)) 
    { 
     aligned.Read(buffer, 0, 10000); 
    } 
} 

Cualquier ayuda sobre esto será muy apreciada.

+0

Ha visto esto: http://mark-dot-net.blogspot.com.au/2012/01/handling-multi-channel-audio-in-naudio.html – yamen

Respuesta

4

BlockAlignReductionStream es innecesario. Aquí hay una forma sencilla de leer de su búfer y en búferes de muestra separados de 16 bit izquierda y derecha.

using (WaveFileReader pcm = new WaveFileReader(@"file.wav")) 
{ 
    int samplesDesired = 5000; 
    byte[] buffer = new byte[samplesDesired * 4]; 
    short[] left = new short[samplesDesired]; 
    short[] right = new short[samplesDesired]; 
    int bytesRead = pcm.Read(buffer, 0, 10000); 
    int index = 0; 
    for(int sample = 0; sample < bytesRead/4; sample++) 
    { 
     left[sample] = BitConverter.ToInt16(buffer, index); 
     index += 2; 
     right[sample] = BitConverter.ToInt16(buffer, index); 
     index += 2; 
    } 
} 
+0

Cómo leer por 32 bits pcm, 2 canales ... – jero2rome

Cuestiones relacionadas