Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.61 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #pragma pack(1)
  5. typedef struct WAVHEADER {
  6.  
  7. // WAV-формат начинается с RIFF-заголовка:
  8. // Содержит символы "RIFF" в ASCII кодировке
  9. // (0x52494646 в big-endian представлении)
  10. __int32_t chunkId;
  11.  
  12. // 36 + subchunk2Size, или более точно: 4 + (8 + subchunk1Size) + (8 + subchunk2Size)
  13. // Это оставшийся размер цепочки, начиная с этой позиции.
  14. // Иначе говоря, это размер файла - 8, то есть, исключены поля chunkId и chunkSize.
  15. __uint32_t chunkSize;
  16.  
  17. // Содержит символы "WAVE"
  18. // (0x57415645 в big-endian представлении)
  19. __int32_t format;
  20.  
  21. // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
  22. // Подцепочка "fmt " описывает формат звуковых данных:
  23.  
  24. // Содержит символы "fmt"
  25. // (0x666d7420 в big-endian представлении)
  26. __int32_t subchunk1Id;
  27.  
  28. // 16 для формата PCM.
  29. // Это оставшийся размер подцепочки, начиная с этой позиции.
  30. __uint32_t subchunk1Size;
  31.  
  32. // Аудио формат
  33. // Для PCM = 1 (то есть, Линейное квантование). Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
  34. __uint16_t audioFormat;
  35.  
  36. // Количество каналов. Моно = 1, Стерео = 2 и т.д.
  37. __uint16_t numChannels;
  38.  
  39. // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
  40. __uint32_t sampleRate;
  41.  
  42. // sampleRate * numChannels * bitsPerSample/8
  43. __uint32_t byteRate;
  44.  
  45. // numChannels * bitsPerSample/8
  46. // Количество байт для одного сэмпла, включая все каналы.
  47. __uint16_t blockAlign;
  48.  
  49. // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
  50. __uint16_t bitsPerSample;
  51.  
  52. // Подцепочка "data" содержит аудио-данные и их размер.
  53.  
  54. // Содержит символы "data"
  55. // (0x64617461 в big-endian представлении)
  56. __int32_t subchunk2Id;
  57.  
  58. // numSamples * numChannels * bitsPerSample/8
  59. // Количество байт в области данных.
  60. __uint32_t subchunk2Size;
  61.  
  62. // Далее следуют непосредственно Wav данные.
  63. } WAVHEADER;
  64. #pragma pop()
  65. int main(int argc, char* argv[])
  66. {
  67. FILE *err;
  68. err = fopen("input.wav", "rb");
  69.  
  70. WAVHEADER header;
  71.  
  72. fread(&header, sizeof(WAVHEADER), 1, err);
  73.  
  74. // Выводим полученные данные
  75. printf("Sample rate: %i\n", header.sampleRate);
  76. printf("Channels: %i\n", header.numChannels);
  77. printf("Bits per sample: %i\n", header.bitsPerSample);
  78. printf("subchunk2Size: %i\n", header.subchunk2Size);
  79.  
  80. // Посчитаем длительность воспроизведения в секундах
  81. double DurationSeconds = 1. * header.subchunk2Size / (header.bitsPerSample / 8.0) / header.numChannels / header.sampleRate;
  82. int DurationMinutes = (int)floor(DurationSeconds) / 60;
  83. DurationSeconds = DurationSeconds - (DurationMinutes * 60);
  84. printf("Duration: %02d:%02.f\n", DurationMinutes, DurationSeconds);
  85.  
  86. fclose(err);
  87.  
  88. getchar();
  89. return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement