2016-11-03 3 views
0

Не могу понять, почему я получаю нуль после чтения предполагаемого содержимого * .wav-файла.Почему бинарный считыватель не читает содержимое * .wav

Ссылка на изображение выхода: http://imgur.com/a/rZWes

using (BinaryReader reader = new BinaryReader(File.Open("test.wav", FileMode.Open))) { 

      // Read the wave file header from the buffer. 

      int chunkID = reader.ReadInt32();   print (chunkID); 
      int fileSize = reader.ReadInt32();   print (fileSize); 
      int riffType = reader.ReadInt32();   print (riffType); 
      int fmtID = reader.ReadInt32();    print (fmtID); 
      int fmtSize = reader.ReadInt32();   print (fmtSize); 
      int fmtCode = reader.ReadInt16();   print (fmtCode); 
      int channels = reader.ReadInt16();   print (channels); 
      int sampleRate = reader.ReadInt32();  print (sampleRate); 
      int fmtAvgBPS = reader.ReadInt32();   print (fmtAvgBPS); 
      int fmtBlockAlign = reader.ReadInt16();  print (fmtBlockAlign); 
      int bitDepth = reader.ReadInt16();   print (bitDepth); 

      int dataID = reader.ReadInt32();   print (dataID); 
      int dataSize = reader.ReadInt32();   print (dataSize); 

      byteArray = reader.ReadBytes(dataSize); 

      // After this you have to split that byte array for each channel (Left,Right) 
      // Wav supports many channels, so you have to read channel from header 
     } 

Заранее спасибо за помощь!

+0

Какая у вас функция 'print'? –

+0

Проблемы с Endian? https://en.wikipedia.org/wiki/Endianness –

+0

Вы должны опубликовать вывод в вопросе вместо ссылки на изображение. Также вы попробовали посмотреть файл wav в шестнадцатеричном редакторе, чтобы проверить свои результаты? – juharr

ответ

0

См это определение заголовка WAV:

http://soundfile.sapp.org/doc/WaveFormat/

вы увидите, что после BitsPerSample (глубина цвета) есть необязательные значения, прежде чем попасть в «данных» размер данных заголовка &.

Если это не формат PCM - вам тоже нужно их прочитать или просто искать «данные» после битDepth.

В файле, который я только что проверил, первое значение - это int16, указывающее число int16s, следующее - в данном конкретном случае 12, поэтому чтение дополнительных 24 байтов приводит меня к заголовку «data».

// Read the wave file header from the buffer. 
    int chunkID = reader.ReadInt32(); // ASCII string = "RIFF" 
    print(chunkID); 
    int fileSize = reader.ReadInt32(); 
    print(fileSize); 
    int riffType = reader.ReadInt32(); // ASCII string "WAVE" 
    print(riffType); 
    int fmtID = reader.ReadInt32();  // ASCII string "fmt " 
    print(fmtID); 
    int fmtSize = reader.ReadInt32(); // 16 = PCM (actually specifies size of data of this section) 
    print(fmtSize); 
    short fmtCode = reader.ReadInt16(); 
    print(fmtCode); 
    short channels = reader.ReadInt16(); 
    print(channels); 
    int sampleRate = reader.ReadInt32(); 
    print(sampleRate); 
    int fmtAvgBPS = reader.ReadInt32(); 
    print(fmtAvgBPS); 
    short fmtBlockAlign = reader.ReadInt16(); 
    print(fmtBlockAlign); 
    short bitDepth = reader.ReadInt16(); 
    print(bitDepth); 

    short[] extraPars = null; 
    if (fmtSize != 16) 
    { 
     short NoOfEPs = reader.ReadInt16(); 
     extraPars = new short[NoOfEPs]; 
     for (int i=0;i<NoOfEPs;i++) 
     extraPars[i] = reader.ReadInt16();; 
    } 

    int dataID = reader.ReadInt32(); // ASCII string = "data" 
    print(dataID); 
    int dataSize = reader.ReadInt32(); 
    print(dataSize); 

    byte [] byteArray = new byte[dataSize]; 
    byteArray = reader.ReadBytes(dataSize); 
Смежные вопросы