Нахождение количества образцов в файле .wav и Hex Editor - PullRequest
4 голосов
/ 02 мая 2011

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

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

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

Если вы любезно сделаете это для меня, пожалуйста, скажите мне количество образцов для каждого .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

/ ******* UPDATE ********* / Еще одна вещь, которую я сделал расчет с 2 файлами Это правильно

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

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

2,473,696 bytes 

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

 617,400

Ответы [ 3 ]

1 голос
/ 03 мая 2011

WAVE формат

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

NumSamples = NumBytes / (NumChannels * BitsPerSample / 8)
1 голос
/ 03 мая 2011

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

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

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

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

0 голосов
/ 24 сентября 2014

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

Обратите внимание, что вышеприведенный ответ элегантно избегал, чтобы объяснить, что ключевые уравнения в спецификации (и ответах на их основе) НЕПРАВИЛЬНЫ: рассмотрим пример для двухканального сигнала 12 бит в секунду ..
Спецификация объясняет, что мы помещаем каждую 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-битной волны согласно спецификации?
CEIL(wChannels * bps / 8) = 3 байта ..
Очевидно правильное уравнение: wBlockAlign=wChannels*CEIL(bps/8)

...