2012-05-02 10 views
7

Ho lottato con questo per un po 'di tempo e non sono riuscito a trovare una soluzione funzionante.Il modo più semplice per leggere i campioni a 2 canali nell'array da WaveStream

Ho un file wav (16 bit PCM: 44kHz 2 canali) e voglio estrarre campioni in due array per ciascuno dei due canali. Per quanto ne so, il metodo diretto per questo non esiste nella libreria NAudio, quindi ho provato a eseguire il seguente codice per leggere alcuni campioni interlacciati ma l'array del buffer rimane vuoto (solo un gruppo di zeri):

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

Qualsiasi aiuto su questo sarà molto apprezzato.

+0

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

risposta

4

BlockAlignReductionStream non necessario. Ecco un modo semplice per leggere dal buffer e in buffer di campionamento sinistro e destro separati da 16 bit.

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

Come leggere per 32 bit pcm, 2 canali ... – jero2rome

Problemi correlati