Как правильно прочитать данные заголовка Riff Wav fmt для всех wav-файловC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как правильно прочитать данные заголовка Riff Wav fmt для всех wav-файлов

Сообщение Anonymous »

У меня есть программа, которая считывает информацию заголовка, такую ​​​​как количество каналов и т. д., из файлов .wav, использующих RIFF wav fmt.
Я хочу сделать ее совместимой с любым файлом расширения .wav, который следует за riff wav fmt. Это код, который у меня есть на данный момент.
WaveReader.h:

Код: Выделить всё

typedef struct {

unsigned char   ChunkID[4];
uint32_t        ChunkSize;
unsigned char   Format[4];
unsigned char   SubChunk1ID[4];
uint32_t        SubChunk1Size;
uint16_t        AudioFormat;
uint16_t        NumChannels;
uint32_t        SampleRate;
uint32_t        BytesRate;
uint16_t        BlockAlign;
uint16_t        BitsPerSample;
unsigned char   SubChunk2ID[4];
uint32_t        SubChunk2Size;

} RiffWav;

WaveReader.cpp

Код: Выделить всё

RiffWav         Header;
InFile = fopen(m_strFileName, "rb");
uint64_t Header_Size = 44;// sizeof(InFile);
CHAR* HeaderBuffer = new CHAR[Header_Size];
fread(HeaderBuffer, 0x01, Header_Size, InFile);

int NumChannels = Header.NumChannels;
int BitsPerSample = Header.BitsPerSample
Проблема, с которой я столкнулся при использовании этого кода, заключается в том, что он не всегда считывает правильную информацию для каждого файла .wav отдельно, и мне пришлось бы использовать функцию fseek, чтобы адаптировать функцию fread для чтения правильных данных заголовка из каждого конкретного файла.
Если я не использую функцию fseek, программа считывает правильные данные из большинства файлов .wav, за исключением нескольких.
Есть есть ли способ, которым мне не нужно использовать функцию fseek, чтобы эта программа была совместима с любыми файлами RIFF wav fmt?
Изменить:
Я выбрал смещение fseek вручную с помощью онлайн-программы чтения файлов .wav, а затем использовал визуальную студию, чтобы увидеть, насколько смещены данные заголовка.
В контексте количество каналов для одного из файлов было 2 в соответствии с онлайн-программой чтения файлов .wav и эта программа имела количество каналов 5200 и BitsPerSample, равный 2. Таким образом, после использования fseek(InFile, 12, SEEK_SET) чтение данных заголовка было правильным.

Подробнее здесь: https://stackoverflow.com/questions/697 ... -wav-files
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»