Учитывая файл WAV, его размер файла и частоту дискретизации, можно ли рассчитать количество выборок?

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


wav
person Simon    schedule 14.04.2010    source источник


Ответы (3)


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

WAV — это простой формат, к сожалению, за эти годы было много странных вариаций этого формата от крупных и мелких разработчиков оборудования и программного обеспечения. Обычно вы можете рассчитывать на кошерный формат, если файлы поступают из современного основного редактора волны. Итак, если образцы стандартизированы путем их экспорта из WaveLab или аналогичного, вы можете сэкономить на написании (небольшого) кода для интерпретатора заголовков.

Самое простое для чтения описание формата .wav находится здесь. StripWav — небольшая программа для стандартизации образцов; есть также более функциональный инструмент командной строки: sox. Sox поддерживает пакетные задания, так что это лучше, чем использование волнового редактора, при условии, что набор файлов .wav является заданным, а не «динамическим».

Итак: если вы можете стандартизировать их раз и навсегда с помощью пакетного задания sox, это должно быть возможно. Я использовал это описание формата и Sox ​​несколько раз с большим эффектом, удачи :)

person Henrik Erlandsson    schedule 11.01.2011

Предполагая, что файл WAV имеет формат PCM, вы можете рассчитать его, используя размер фрагмента данных. Количество байтов на выборку — это просто количество битов на выборку, деленное на восемь. Количество битов на выборку будет присутствовать в структуре WAVEFORMAT. Это можно использовать для точного подсчета проб.

person Mark Heath    schedule 15.04.2010
comment
могу ли я определить размер фрагмента данных по размеру файла или мне нужно знать больше - например. размер заголовка? - person Simon; 16.04.2010
comment
Файлы WAV всегда имеют фрагмент формата и фрагмент данных. У них могут быть другие куски. Единственный способ убедиться в размере фрагмента данных — найти его и прочитать его параметр размера. Какой язык и библиотеку вы используете? - person Mark Heath; 16.04.2010

В формате PCM wav заголовок содержит информацию, называемую blockalign, о том, сколько байтов занимает один образец.

Как правило, если у вас есть стандартный wav-файл RIFF PCM без прикрепленных к нему метаданных (обычный случай). Выравнивание блока представляет собой 2-байтовое целое число со смещением 32 (с 33-го по 34-й байты от начала wav-файла). И размер файла данных, называемый datasize, представляет собой 4-байтовое целое число со смещением 40 (байты с 41-го по 44-й образуют начало файла wav).

Теперь datasize/blockalign — это то, что вам нужно.

ПС

В случае, если у вас более сложный формат wav, если это RIFF, информация о формате и данные помещаются в разные «фрагменты» (наряду с некоторыми другими фрагментами, которые вам могут не понадобиться), и упомянутые выше смещения могут быть неправильными, тогда вам следует смотреть на куски. В вашем случае вам нужно найти фрагмент fmt и data.

Каждая порция начинается с 4-байтовых кодированных данных ASCII, называемых FOURCC, «fmt» указывает, что порция включает в себя информацию о формате, а «данные» указывает порцию данных. Сразу после FOURCC находится 4-байтовое целое число, указывающее размер (в байтах) фрагмента после (FOURCC и эти 4 байта не учитываются).

Использованная литература:

Ссылка на простой заголовок wav ЗДЕСЬ

Более общий формат RIFF wav ЗДЕСЬ

person SuperLucky    schedule 12.10.2014