smatskevich

WavReader

Dec 1st, 2020 (edited)
1,166
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

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×