Я учусь читать WAV-файлы в C ++ и извлекать данные в соответствии с заголовком. У меня есть несколько файлов WAV. Просматривая заголовок всех них, я вижу, что все они следуют правилам волновых файлов. Однако файлы записей произведены Team Speak странные, но они все еще воспроизводимы в медиа-плеерах.
Итак, глядя на стандартный формат файлов WAV, это выглядит так:
Поэтому во всех файлах, которые выглядят нормально, я получаю допустимые значения для всех значений от «AudioFormat» до «BitsPerSample» (из рисунка). Однако в файлах TeamSpeak ВСЕ эти значения точно нуль.
Это, но первые 3 значения не равны нулю. Таким образом, в первой и третьей строках есть «RIFF» и «WAVE», а размер ChunkSize кажется законным.
Итак, мой вопрос: Как проигрыватель узнает что-либо о таком файле и узнает, что этот файл является моно или стерео? Частота дискретизации? Что-нибудь об этом? Как будто есть что-то стандартное, когда все эти значения равны нулю?
Обновить
Я проверил файл с Медиа информация и получил это:
General
Complete name : ts3_recording_16_10_02_17_53_54.wav
Format : Wave
File size : 2.45 MiB
Duration : 13 s 380 ms
Overall bit rate mode : Constant
Overall bit rate : 1 536 kb/s
Audio
Format : PCM
Format settings, Endianness : Little
Format settings, Sign : Signed
Codec ID : 1
Duration : 13 s 380 ms
Bit rate mode : Constant
Bit rate : 1 536 kb/s
Channel(s) : 2 channels
Sampling rate : 48.0 kHz
Bit depth : 16 bits
Stream size : 2.45 MiB (100%)
Тем не менее, не понимаю, как он пришел к этим выводам.
После изучения вашего файла с помощью шестнадцатеричного редактора с бинарными шаблонами WAV становится очевидным, что перед «fmt» есть дополнительный блок «JUNK» (скриншот прилагается). Блок JUNK, возможно, существует по некоторым причинам, но все его значения равны 0. Вам нужно найти (fseek возможно) wav-файл в вашем коде для первого появления байтов «fmt» и проанализировать информацию WAVEFORMATEX оттуда.
Других решений пока нет …