Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cmath>
- #include <cstdio>
- #include <iostream>
- // Структура, описывающая заголовок WAV файла.
- struct WAVHEADER
- {
- // WAV-формат начинается с RIFF-заголовка:
- // Содержит символы "RIFF" в ASCII кодировке
- // (0x52494646 в big-endian представлении)
- char chunkId[4];
- // 36 + subchunk2Size, или более точно:
- // 4 + (8 + subchunk1Size) + (8 + subchunk2Size)
- // Это оставшийся размер цепочки, начиная с этой позиции.
- // Иначе говоря, это размер файла - 8, то есть,
- // исключены поля chunkId и chunkSize.
- unsigned int chunkSize;
- // Содержит символы "WAVE"
- // (0x57415645 в big-endian представлении)
- char format[4];
- // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
- // Подцепочка "fmt " описывает формат звуковых данных:
- // Содержит символы "fmt "
- // (0x666d7420 в big-endian представлении)
- char subchunk1Id[4];
- // 16 для формата PCM.
- // Это оставшийся размер подцепочки, начиная с этой позиции.
- unsigned int subchunk1Size;
- // Аудио формат, полный список можно получить здесь http://audiocoding.ru/wav_formats.txt
- // Для PCM = 1 (то есть, Линейное квантование).
- // Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
- unsigned short audioFormat;
- // Количество каналов. Моно = 1, Стерео = 2 и т.д.
- unsigned short numChannels;
- // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
- unsigned int sampleRate;
- // sampleRate * numChannels * bitsPerSample/8
- unsigned int 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 int subchunk2Size;
- // Далее следуют непосредственно Wav данные.
- };
- int main()
- {
- FILE *file = fopen("speech.wav", "r");
- if (!file)
- {
- std::cout << "Failed open file";
- return 0;
- }
- WAVHEADER header;
- fread(&header, sizeof(WAVHEADER), 1, file);
- // Выводим полученные данные
- std::cout << header.chunkId[0] << header.chunkId[1] << header.chunkId[2] << header.chunkId[3] << std::endl;
- printf("Chunk size: %d\n", header.chunkSize);
- std::cout << header.format[0] << header.format[1] << header.format[2] << header.format[3] << std::endl;
- std::cout << header.subchunk1Id[0] << header.subchunk1Id[1] << header.subchunk1Id[2] << header.subchunk1Id[3] << std::endl;
- printf("SubChunkId1: %d\n", header.subchunk1Size);
- printf("Audio format: %d\n", header.audioFormat);
- printf("Channels: %d\n", header.numChannels);
- printf("Sample rate: %d\n", header.sampleRate);
- printf("Bits per sample: %d\n", header.bitsPerSample);
- std::cout << header.subchunk2Id[0] << header.subchunk2Id[1] << header.subchunk2Id[2] << header.subchunk2Id[3] << std::endl;
- // Посчитаем длительность воспроизведения в секундах
- float fDurationSeconds = 1.f * header.subchunk2Size / (header.bitsPerSample / 8) / header.numChannels / header.sampleRate;
- int iDurationMinutes = (int)floor(fDurationSeconds) / 60;
- fDurationSeconds = fDurationSeconds - (iDurationMinutes * 60);
- printf("Duration: %02d:%02.f\n", iDurationMinutes, fDurationSeconds);
- char* data = new char[header.subchunk2Size];
- fread(data, header.subchunk2Size, 1, file);
- std::cout << "Data is successfully loaded." << std::endl;
- delete[] data;
- fclose(file);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement