Во-первых, я пытаюсь сделать это без каких-либо проприетарных библиотек, чтобы он был более переносимым, и я лучше понимаю, что здесь происходит. Я в порядке, пишу свои собственные классы и библиотеки для обработки повторяющихся функций (разбор заголовков и т. Д.).
Поэтому мне интересно, как можно прочитать WAV / RIFF файл через поток для того, чтобы можно было вычислить информацию об указанном аудиофайле (то есть длину аудио в файле, сколько семплов, сколько кадров и т. д.). а затем перебрать эти кадры или образцы для других функций.
Я знаю, что будет читать его в виде двоичного файла через fstream
и позволяя для заголовка (и получения некоторой информации из заголовка), как указано в Спецификации RIFF но как распознать байты в кадрах или сэмплах, а что в длину?
Я могу найти проблемы, связанные с этим, в других языках, но я не видел ничего связанного с этим в C ++.
Я считаю, что чтение 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-плеер, чтобы позже я мог слушать свои любимые радиопередачи.