Наше приложение должно знать количество семплов загружаемых аудиофайлов. Используемая нами библиотека может надежно определить частоту дискретизации, но не количество выборок. Можем ли мы рассчитать количество выборок только по размеру файла и частоте выборки?
Учитывая файл WAV, его размер файла и частоту дискретизации, можно ли рассчитать количество выборок?
Ответы (3)
Что сказал Марк. Нет, обычно вам нужно интерпретировать заголовок. Но если формат, количество каналов и количество битов на выборку известны и одинаковы для всех файлов, вы теоретически можете вычислить их по размеру файла.
WAV — это простой формат, к сожалению, за эти годы было много странных вариаций этого формата от крупных и мелких разработчиков оборудования и программного обеспечения. Обычно вы можете рассчитывать на кошерный формат, если файлы поступают из современного основного редактора волны. Итак, если образцы стандартизированы путем их экспорта из WaveLab или аналогичного, вы можете сэкономить на написании (небольшого) кода для интерпретатора заголовков.
Самое простое для чтения описание формата .wav находится здесь. StripWav — небольшая программа для стандартизации образцов; есть также более функциональный инструмент командной строки: sox. Sox поддерживает пакетные задания, так что это лучше, чем использование волнового редактора, при условии, что набор файлов .wav является заданным, а не «динамическим».
Итак: если вы можете стандартизировать их раз и навсегда с помощью пакетного задания sox, это должно быть возможно. Я использовал это описание формата и Sox несколько раз с большим эффектом, удачи :)
Предполагая, что файл WAV имеет формат PCM, вы можете рассчитать его, используя размер фрагмента данных. Количество байтов на выборку — это просто количество битов на выборку, деленное на восемь. Количество битов на выборку будет присутствовать в структуре WAVEFORMAT. Это можно использовать для точного подсчета проб.
В формате 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 ЗДЕСЬ