-
-
Save BOPOHOB/c28e8be410f7588b43d4faefda64bb35 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
#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