Получить кадры и образцы WAV-файла

Во-первых, я пытаюсь сделать это без каких-либо проприетарных библиотек, чтобы он был более переносимым, и я лучше понимаю, что здесь происходит. Я в порядке, пишу свои собственные классы и библиотеки для обработки повторяющихся функций (разбор заголовков и т. Д.).

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

Я знаю, что будет читать его в виде двоичного файла через fstream и позволяя для заголовка (и получения некоторой информации из заголовка), как указано в Спецификации RIFF но как распознать байты в кадрах или сэмплах, а что в длину?

Я могу найти проблемы, связанные с этим, в других языках, но я не видел ничего связанного с этим в C ++.

1

Решение

Я считаю, что чтение WAV-файла — это то же самое, что и чтение любых двоичных файлов, таких как битовая карта. Основная идея заключается в том, чтобы сначала прочитать заголовок файла, а затем прочитать данные в соответствии с информацией, показанной в заголовке. Заголовок может обычно заполняться структурой данных Си, и вы можете напрямую использовать эту информацию.

struct wavfile
{
char   id[4];            // should always contain "RIFF"int    totallength;      // total file length minus 8
char   wavefmt[8];       // should be "WAVEfmt "int    format;           // 16 for PCM format
short  pcm;              // 1 for PCM format
short  channels;         // channels
int    frequency;        // sampling frequency
int    bytes_per_second;
short  bytes_by_capture;
short  bits_per_sample;
char   data[4];          // should always contain "data"int    bytes_in_data;
};

FILE * fp = fopen("file.wav", "rb");
wavfile info;
if (fp) {
fread(&info, 1, sizeof(wavfile), fp);
// try to read data here
}

Я не думаю, что в файле WAV есть кадр, просто убедитесь, что длина каждой точки выборки, которая wavinfo.bits_per_sample / 8, Если значение равно 2, мы можем прочитать short как образец.

Вот Это блог, есть еще несколько примеров кода, но я думаю, что вам все еще нужно отладить.

2

Другие решения

Заголовок WAV / RIFF сообщает вам размер выборки (8 бит, 16 бит и т. Д.); он также сообщает вам порядок байтов и то, должен ли каждый образец интерпретироваться как число со знаком или без знака (для 16 бит +); а также количество каналов.

Не уверен, что еще тебе нужно. Это почти все, что нужно, чтобы прожевать файл. Читая цитируемую ссылку, кажется, в значительной степени отвечает на все ваши вопросы.

Это та же самая ссылка, которую я использовал в качестве ссылки, когда собирал небольшой быстрый взлом, чтобы получить аудио с моей звуковой карты, которую я подключил к своему радио. Вышеупомянутый хак проанализировал аудио на лету, чтобы найти беззвучные места, а затем разделил аудиопоток в беззвучных местах на отдельные файлы. Полученных данных достаточно для того, чтобы файл .wav был приемлем для моего кодировщика .mp3, создавая файлы .mp3, которые я мог записать на свой mp3-плеер, чтобы позже я мог слушать свои любимые радиопередачи.

0

По вопросам рекламы [email protected]