Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #pragma pack(1)
- typedef struct WAVHEADER {
- // WAV-формат начинается с RIFF-заголовка:
- // Содержит символы "RIFF" в ASCII кодировке
- // (0x52494646 в big-endian представлении)
- __int32_t chunkId;
- // 36 + subchunk2Size, или более точно: 4 + (8 + subchunk1Size) + (8 + subchunk2Size)
- // Это оставшийся размер цепочки, начиная с этой позиции.
- // Иначе говоря, это размер файла - 8, то есть, исключены поля chunkId и chunkSize.
- __uint32_t chunkSize;
- // Содержит символы "WAVE"
- // (0x57415645 в big-endian представлении)
- __int32_t format;
- // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
- // Подцепочка "fmt " описывает формат звуковых данных:
- // Содержит символы "fmt"
- // (0x666d7420 в big-endian представлении)
- __int32_t subchunk1Id;
- // 16 для формата PCM.
- // Это оставшийся размер подцепочки, начиная с этой позиции.
- __uint32_t subchunk1Size;
- // Аудио формат
- // Для PCM = 1 (то есть, Линейное квантование). Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
- __uint16_t audioFormat;
- // Количество каналов. Моно = 1, Стерео = 2 и т.д.
- __uint16_t numChannels;
- // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
- __uint32_t sampleRate;
- // sampleRate * numChannels * bitsPerSample/8
- __uint32_t byteRate;
- // numChannels * bitsPerSample/8
- // Количество байт для одного сэмпла, включая все каналы.
- __uint16_t blockAlign;
- // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
- __uint16_t bitsPerSample;
- // Подцепочка "data" содержит аудио-данные и их размер.
- // Содержит символы "data"
- // (0x64617461 в big-endian представлении)
- __int32_t subchunk2Id;
- // numSamples * numChannels * bitsPerSample/8
- // Количество байт в области данных.
- __uint32_t subchunk2Size;
- // Далее следуют непосредственно Wav данные.
- } WAVHEADER;
- #pragma pop()
- int main(int argc, char* argv[])
- {
- FILE *err;
- err = fopen("input.wav", "rb");
- WAVHEADER header;
- fread(&header, sizeof(WAVHEADER), 1, err);
- // Выводим полученные данные
- printf("Sample rate: %i\n", header.sampleRate);
- printf("Channels: %i\n", header.numChannels);
- printf("Bits per sample: %i\n", header.bitsPerSample);
- printf("subchunk2Size: %i\n", header.subchunk2Size);
- // Посчитаем длительность воспроизведения в секундах
- double DurationSeconds = 1. * header.subchunk2Size / (header.bitsPerSample / 8.0) / header.numChannels / header.sampleRate;
- int DurationMinutes = (int)floor(DurationSeconds) / 60;
- DurationSeconds = DurationSeconds - (DurationMinutes * 60);
- printf("Duration: %02d:%02.f\n", DurationMinutes, DurationSeconds);
- fclose(err);
- getchar();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement