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

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

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

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

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

2 ответа

Я считаю, что читать 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 как образец.

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

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

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

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

Другие вопросы по тегам