Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- // Структура, описывающая заголовок WAV файла.
- typedef struct WAVHEADER {
- // WAV-формат начинается с RIFF-заголовка:
- // Содержит символы "RIFF" в ASCII кодировке
- // (0x52494646 в big-endian представлении)
- char chunkId[4];
- // 36 + subchunk2Size, или более точно:
- // 4 + (8 + subchunk1Size) + (8 + subchunk2Size)
- // Это оставшийся размер цепочки, начиная с этой позиции.
- // Иначе говоря, это размер файла - 8, то есть,
- // исключены поля chunkId и chunkSize.
- unsigned long chunkSize;
- // Содержит символы "WAVE"
- // (0x57415645 в big-endian представлении)
- char format[4];
- // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
- // Подцепочка "fmt " описывает формат звуковых данных:
- // Содержит символы "fmt "
- // (0x666d7420 в big-endian представлении)
- char subchunk1Id[4];
- // 16 для формата PCM.
- // Это оставшийся размер подцепочки, начиная с этой позиции.
- unsigned long subchunk1Size;
- // Аудио формат, полный список можно получить здесь http://audiocoding.ru/wav_formats.txt
- // Для PCM = 1 (то есть, Линейное квантование).
- // Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
- unsigned short audioFormat;
- // Количество каналов. Моно = 1, Стерео = 2 и т.д.
- unsigned short numChannels;
- // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
- unsigned long sampleRate;
- // sampleRate * numChannels * bitsPerSample/8
- unsigned long byteRate;
- // numChannels * bitsPerSample/8
- // Количество байт для одного сэмпла, включая все каналы.
- unsigned short blockAlign;
- // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
- unsigned short bitsPerSample;
- // Подцепочка "data" содержит аудио-данные и их размер.
- // Содержит символы "data"
- // (0x64617461 в big-endian представлении)
- char subchunk2Id[4];
- // numSamples * numChannels * bitsPerSample/8
- // Количество байт в области данных.
- unsigned long subchunk2Size;
- // Далее следуют непосредственно Wav данные.
- } WAVHEADER;
- int main(int argc, char* argv[])
- {
- FILE *err;
- err = fopen("input.wav", "rb");
- WAVHEADER header;
- fread(&header, sizeof(WAVHEADER), 1, err);
- // Выводим полученные данные
- printf("Sample rate: %lu\n", header.sampleRate);
- printf("Channels: %d\n", header.numChannels);
- printf("Bits per sample: %hu\n", header.bitsPerSample);
- // Посчитаем длительность воспроизведения в секундах
- float DurationSeconds = 1. * header.subchunk2Size / (header.bitsPerSample / 8) / 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