Поиск количества образцов в файле .wav и шестнадцатеричном редакторе

Нужна помощь с шестнадцатеричным редактором и аудиофайлами. У меня возникли проблемы с вычислением формулы для получения количества сэмплов в моих файлах .wav.

Я скачал StripWav, который сообщает мне количество сэмплов в .waves, но до сих пор не может понять формулу.

Не могли бы вы скачать эти два файла .wav, открыть их в шестнадцатеричном редакторе и сказать мне формулу для получения количества сэмплов.

Если вы так любезно сделаете это для меня, пожалуйста, сообщите мне количество образцов для каждого .wav, чтобы я мог убедиться, что формула верна.

http://sinewavemultimedia.com/1wav.wav http://sinewavemultimedia.com/2wav.wav

Вот проблема у меня две программы,

Один читает данные wav, а другой показывает numsamples вот данные

RIFF 'WAVE' (wave file)
        <fmt > (format description)
                PCM format
                2 channel
                44100 frames per sec
                176400 bytes per sec
                4 bytes per frame
                16 bits per sample
        <data> (waveform data - 92252 bytes)

Но другая программа говорит, что NumSamples

23,063 samples

/*******ОБНОВЛЕНИЕ *********/ Еще одна вещь, которую я сделал для расчета с двумя файлами.

92,296 bytes and num samples is 23,063` 

Но этот другой не выходит правильно, это более 2 мегабайт, я только что вычитал 44 байта, и я делаю это неправильно здесь? вот размер файла

2,473,696 bytes 

Но правильные цифры

 617,400

person james    schedule 02.05.2011    source источник
comment
См. stackoverflow.com /questions/5838093/, как расшифровать.   -  person AShelly    schedule 03.05.2011
comment
О, я вижу, что это и ваш вопрос тоже.   -  person AShelly    schedule 03.05.2011


Ответы (3)


Не существует простой формулы для определения количества семплов в WAV-файле. Так называемый «канонический» файл WAV состоит из 44-байтового заголовка, за которым следуют фактические данные выборки. Итак, если вы знаете, что файл использует 2 байта на выборку, то количество выборок равно размеру файла в байтах минус 44 (для заголовка), а затем делится на 2 (поскольку на выборку приходится 2 байта). образец).

К сожалению, не все файлы WAV являются «каноническими». Файл WAV использует формат RIFF, поэтому правильный способ анализа файла WAV — поиск в файле и поиск различных фрагментов.

Вот пример (не уверен, на каком языке вам нужно это сделать):

http://msdn.microsoft.com/en-us/library/ms712835

person MusiGenesis    schedule 02.05.2011
comment
Обновил мой вопрос. Пожалуйста, помогите дальше - person james; 03.05.2011
comment
Ваша другая программа, кажется, неправильно маркирует. 92252 байта данных означают 46126 выборок (поскольку ваш формат составляет 2 байта на выборку). Поскольку файл является стереофоническим (2-канальным), это означает, что он содержит 23063 кадров, а не 23063 сэмпла — 2-канальный файл WAV содержит два семпла на кадр, тогда как моно файл содержит только один образец на кадр. - person MusiGenesis; 03.05.2011

формат WAVE

Вы должны прочитать заголовок fmt, чтобы определить количество каналов и битов на семпл, затем прочитать размер фрагмента data, чтобы определить, сколько байтов данных содержится в аудио. Потом:

NumSamples = NumBytes / (NumChannels * BitsPerSample / 8)
person Jason Williams    schedule 02.05.2011
comment
Обновил мой вопрос, пожалуйста, помогите дальше/ - person james; 03.05.2011

format chunk (fmt) WAVE имеет 'байтов на кадр выборки', указанный как wBlockAlign.
Итак: framesTotal = data.ck_size / fmt.wBlockAlign;
и samplesTotal = framesTotal * wChannels;
Таким образом, samplesTotal===FramesTotal IIF wChannels === 1!!

Обратите внимание, как вышеприведенный ответ элегантно избегается, чтобы объяснить, что ключевые уравнения спецификации (и ответы, основанные на них) НЕВЕРНЫ: рассмотрим пример флора с 2-канальной волной 12 бит в секунду. слово:

  note: t=point in time, chan = channel
+---------------------------+---------------------------+-----
|         frame 1           |         frame 2           |  etc
+-------------+-------------+-------------+-------------+-----
| chan 1 @ t1 | chan 2 @ t1 | chan 1 @ t2 | chan 2 @ t2 |  etc
+------+------+------+------+------+------+------+------+-----
| byte | byte | byte | byte | byte | byte | byte | byte |  etc
+------+------+------+------+------+------+------+------+-----

Итак.. сколько байтов занимает образец кадра (BlockAlign) для 2-канальной волны 12 бит/с в соответствии со спецификацией?
‹sarcasm> CEIL(wChannels * bps / 8) = 3 байта.. ‹/sarcasm>
Очевидно, правильное уравнение: wBlockAlign=wChannels*CEIL(bps/8)

person GitaarLAB    schedule 24.09.2014