Advertisement
Guest User

Untitled

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