smatskevich

WavReader

Dec 1st, 2020 (edited)
1,094
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <cmath>
  2. #include <cstdio>
  3. #include <iostream>
  4.  
  5. // Структура, описывающая заголовок WAV файла.
  6. struct WAVHEADER
  7. {
  8.   // WAV-формат начинается с RIFF-заголовка:
  9.  
  10.   // Содержит символы "RIFF" в ASCII кодировке
  11.   // (0x52494646 в big-endian представлении)
  12.   char chunkId[4];
  13.  
  14.   // 36 + subchunk2Size, или более точно:
  15.   // 4 + (8 + subchunk1Size) + (8 + subchunk2Size)
  16.   // Это оставшийся размер цепочки, начиная с этой позиции.
  17.   // Иначе говоря, это размер файла - 8, то есть,
  18.   // исключены поля chunkId и chunkSize.
  19.   unsigned int chunkSize;
  20.  
  21.   // Содержит символы "WAVE"
  22.   // (0x57415645 в big-endian представлении)
  23.   char format[4];
  24.  
  25.   // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
  26.   // Подцепочка "fmt " описывает формат звуковых данных:
  27.  
  28.   // Содержит символы "fmt "
  29.   // (0x666d7420 в big-endian представлении)
  30.   char subchunk1Id[4];
  31.  
  32.   // 16 для формата PCM.
  33.   // Это оставшийся размер подцепочки, начиная с этой позиции.
  34.   unsigned int subchunk1Size;
  35.  
  36.   // Аудио формат, полный список можно получить здесь http://audiocoding.ru/wav_formats.txt
  37.   // Для PCM = 1 (то есть, Линейное квантование).
  38.   // Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
  39.   unsigned short audioFormat;
  40.  
  41.   // Количество каналов. Моно = 1, Стерео = 2 и т.д.
  42.   unsigned short numChannels;
  43.  
  44.   // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
  45.   unsigned int sampleRate;
  46.  
  47.   // sampleRate * numChannels * bitsPerSample/8
  48.   unsigned int byteRate;
  49.  
  50.   // numChannels * bitsPerSample/8
  51.   // Количество байт для одного сэмпла, включая все каналы.
  52.   unsigned short blockAlign;
  53.  
  54.   // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
  55.   unsigned short bitsPerSample;
  56.  
  57.   // Подцепочка "data" содержит аудио-данные и их размер.
  58.  
  59.   // Содержит символы "data"
  60.   // (0x64617461 в big-endian представлении)
  61.   char subchunk2Id[4];
  62.  
  63.   // numSamples * numChannels * bitsPerSample/8
  64.   // Количество байт в области данных.
  65.   unsigned int subchunk2Size;
  66.  
  67.   // Далее следуют непосредственно Wav данные.
  68. };
  69.  
  70. int main()
  71. {
  72.   FILE *file = fopen("speech.wav", "r");
  73.   if (!file)
  74.   {
  75.     std::cout << "Failed open file";
  76.     return 0;
  77.   }
  78.  
  79.   WAVHEADER header;
  80.   fread(&header, sizeof(WAVHEADER), 1, file);
  81.  
  82.   // Выводим полученные данные
  83.   std::cout << header.chunkId[0] << header.chunkId[1] << header.chunkId[2] << header.chunkId[3] << std::endl;
  84.   printf("Chunk size: %d\n", header.chunkSize);
  85.   std::cout << header.format[0] << header.format[1] << header.format[2] << header.format[3] << std::endl;
  86.   std::cout << header.subchunk1Id[0] << header.subchunk1Id[1] << header.subchunk1Id[2] << header.subchunk1Id[3] << std::endl;
  87.   printf("SubChunkId1: %d\n", header.subchunk1Size);
  88.   printf("Audio format: %d\n", header.audioFormat);
  89.   printf("Channels: %d\n", header.numChannels);
  90.   printf("Sample rate: %d\n", header.sampleRate);
  91.   printf("Bits per sample: %d\n", header.bitsPerSample);
  92.   std::cout << header.subchunk2Id[0] << header.subchunk2Id[1] << header.subchunk2Id[2] << header.subchunk2Id[3] << std::endl;
  93.  
  94.   // Посчитаем длительность воспроизведения в секундах
  95.   float fDurationSeconds = 1.f * header.subchunk2Size / (header.bitsPerSample / 8) / header.numChannels / header.sampleRate;
  96.   int iDurationMinutes = (int)floor(fDurationSeconds) / 60;
  97.   fDurationSeconds = fDurationSeconds - (iDurationMinutes * 60);
  98.   printf("Duration: %02d:%02.f\n", iDurationMinutes, fDurationSeconds);
  99.  
  100.   char* data = new char[header.subchunk2Size];
  101.   fread(data, header.subchunk2Size, 1, file);
  102.  
  103.   std::cout << "Data is successfully loaded." << std::endl;
  104.  
  105.   delete[] data;
  106.   fclose(file);
  107.   return 0;
  108. }
  109.  
RAW Paste Data