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