2014-09-03 6 views
1

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

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

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

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

ответ

0

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

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

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

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 в качестве образца.

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

+0

, хотя этот подход действительно, вы должны учитывать, работаете ли вы на 32- или 64-разрядной машине. фактическая длина 'int' и' short' зависит от архитектуры машины, а длина частей заголовка wav - нет. следовательно, этот код может работать на 32-битной архитектуре, но не на 64 (или наоборот). – lCapp

 Смежные вопросы

  • Нет связанных вопросов^_^