Skip to content

Instantly share code, notes, and snippets.

@BOPOHOB
Forked from alexey-detr/main.cpp
Last active March 15, 2017 20:02
Show Gist options
  • Save BOPOHOB/c28e8be410f7588b43d4faefda64bb35 to your computer and use it in GitHub Desktop.
Save BOPOHOB/c28e8be410f7588b43d4faefda64bb35 to your computer and use it in GitHub Desktop.
Читаем заголовок WAV файла на C++
#ifndef WAVHEADER_H
#define WAVHEADER_H
#include <QtGlobal>
#include <QString>
#include <QDebug>
// Структура, описывающая заголовок WAV файла.
struct WAVHeader
{
bool isValid() const { return numChannels > 0 && sampleRate > 0
&& chunkSize - subchunk2Size == 36
&& subchunk1Size == 16
&& byteRate == sampleRate * blockAlign
&& blockAlign == numChannels * bitsPerSample >> 3; }
// WAV-формат начинается с RIFF-заголовка:
// Содержит символы "RIFF" в ASCII кодировке
quint8 chunkId[4];
// 36 + subchunk2Size, или более точно:
// 4 + (8 + subchunk1Size) + (8 + subchunk2Size)
// Это оставшийся размер цепочки, начиная с этой позиции.
// Иначе говоря, это размер файла - 8, то есть,
// исключены поля chunkId и chunkSize.
quint32 chunkSize;
// Содержит символы "WAVE"
// (0x57415645 в big-endian представлении)
quint8 format[4];
// Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
// Подцепочка "fmt " описывает формат звуковых данных:
// Содержит символы "fmt "
quint8 subchunk1Id[4];
// 16 для формата PCM.
// Это оставшийся размер подцепочки, начиная с этой позиции.
quint32 subchunk1Size;
// Аудио формат, полный список можно получить здесь http://audiocoding.ru/wav_formats.txt
// Для PCM = 1 (то есть, Линейное квантование).
// Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
quint16 audioFormat;
// Количество каналов. Моно = 1, Стерео = 2 и т.д.
quint16 numChannels;
// Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
quint32 sampleRate;
// sampleRate * numChannels * bitsPerSample/8
quint32 byteRate;
// numChannels * bitsPerSample/8
// Количество байт для одного сэмпла, включая все каналы.
quint16 blockAlign;
// Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
quint16 bitsPerSample;
// Подцепочка "data" содержит аудио-данные и их размер.
// Содержит символы "data"
quint8 subchunk2Id[4];
// numSamples * numChannels * bitsPerSample/8
// Количество байт в области данных.
quint32 subchunk2Size;
quint32 getNumSamples() const {
return subchunk2Size / numChannels / getSampleSize();
}
quint32 getSampleSize() const {
return bitsPerSample >> 3;
}
// Далее следуют непосредственно Wav данные.
};
inline QDebug operator<<(QDebug out, WAVHeader data) {
if (!data.isValid()) {
return out << "invalid wav header" << (data.chunkSize - data.subchunk2Size);
}
return out << QString("WAVHeader {\n\
RIFF {\n\
chunkSize : %1\n\
}\n\
WAVE {\n\
fmt {\n\
subchunk1Size : %2\n\
audioFormat : %3\n\
numChannels : %4\n\
sampleRate : %5\n\
byteRate : %6\n\
blockAlign : %7\n\
bitsPerSample : %8\n\
}\n\
data {\n\
subchunk2Size : %9\n\
}\n\
}\n}").arg(QString::number(data.chunkSize),
QString::number(data.subchunk1Size),
QString::number(data.audioFormat),
QString::number(data.numChannels),
QString::number(data.sampleRate),
QString::number(data.byteRate),
QString::number(data.blockAlign),
QString::number(data.bitsPerSample),
QString::number(data.subchunk2Size)).toLocal8Bit().data();
}
#endif // WAVHEADER_H
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment