Last active
April 7, 2024 04:56
-
-
Save alexey-detr/1664067 to your computer and use it in GitHub Desktop.
Читаем заголовок WAV файла на C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <tchar.h> | |
#include <conio.h> | |
#include <math.h> | |
// Структура, описывающая заголовок WAV файла. | |
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 данные. | |
}; | |
int _tmain(int argc, _TCHAR* argv[]) | |
{ | |
FILE *file; | |
errno_t err; | |
err = fopen_s(&file, "Slipknot - Three Nil.wav", "rb"); | |
if (err) | |
{ | |
printf_s("Failed open file, error %d", err); | |
return 0; | |
} | |
WAVHEADER header; | |
fread_s(&header, sizeof(WAVHEADER), sizeof(WAVHEADER), 1, file); | |
// Выводим полученные данные | |
printf_s("Sample rate: %d\n", header.sampleRate); | |
printf_s("Channels: %d\n", header.numChannels); | |
printf_s("Bits per sample: %d\n", header.bitsPerSample); | |
// Посчитаем длительность воспроизведения в секундах | |
float fDurationSeconds = 1.f * header.subchunk2Size / (header.bitsPerSample / 8) / header.numChannels / header.sampleRate; | |
int iDurationMinutes = (int)floor(fDurationSeconds) / 60; | |
fDurationSeconds = fDurationSeconds - (iDurationMinutes * 60); | |
printf_s("Duration: %02d:%02.f\n", iDurationMinutes, fDurationSeconds); | |
fclose(file); | |
_getch(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Хз почему, но именно этот код заставил мою еспшку правильно читать заголовки, спасибо!)