2012-05-02 18 views
7

Tôi đã đấu tranh với điều này trong một thời gian và tôi không thể tìm được giải pháp làm việc.Cách dễ nhất để đọc các mẫu 2 kênh thành mảng từ WaveStream

Tôi có tệp wav (16 bit PCM: 44kHz 2 kênh) và tôi muốn trích xuất mẫu thành hai mảng cho mỗi kênh. Theo như tôi biết phương pháp trực tiếp cho điều này không tồn tại trong thư viện NAudio, vì vậy tôi đã thử chạy đoạn mã sau để đọc một số mẫu xen kẽ nhưng mảng đệm vẫn trống (chỉ là một số 0):

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

Bất kỳ trợ giúp nào về điều này sẽ được nhiều người đánh giá cao.

+0

Bạn đã thấy điều này: http://mark-dot-net.blogspot.com.au/2012/01/handling-multi-channel-audio-in-naudio.html – yamen

Trả lời

4

BlockAlignReductionStream là không cần thiết. Đây là một cách đơn giản để đọc ra khỏi bộ đệm của bạn và vào các bộ đệm mẫu riêng biệt bên trái và bên phải 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

Làm thế nào để đọc cho 32bit pcm, 2 kênh ... – jero2rome

Các vấn đề liên quan