2012-05-02 13 views
7

Od pewnego czasu borykam się z tym problemem i nie mogłem znaleźć działającego rozwiązania.Najprostszy sposób na odczytywanie próbek dwukanałowych do macierzy od WaveStream

Mam plik wav (16-bitowy PCM: 44kHz 2 kanały) i chcę pobrać próbki do dwóch tablic dla każdego z dwóch kanałów. O ile mi wiadomo, bezpośrednia metoda nie istnieje w bibliotece NAudio, więc próbowałem uruchomić następujący kod, aby odczytać kilka próbek z przeplotem, ale tablica buforów pozostaje pusta (tylko kilka zer):

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

Każda pomoc w tej sprawie będzie bardzo cenna.

+0

Widzieliście to: http://mark-dot-net.blogspot.com.au/2012/01/handling-multi-channel-audio-in-naudio.html – yamen

Odpowiedz

4

BlockAlignReductionStream jest niepotrzebny. Oto prosty sposób odczytywania bufora i oddzielnych 16-bitowych buforów próbek.

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

Jak czytać 32bit pcm, 2 kanały ... – jero2rome

Powiązane problemy