Бібліотека audiere дозволяє працювати з аудіофайлами різних форматів (wav, mp3 тощо). Для роботи нам знадобляться файли audiere.h, audiere.lib, audiere.dll. h-файл підключається до коду програми
#include "audiere.h"
lib-файл лінкуємо в .pro
LIBS += audiere.lib
dll тягаємо за програмою.
У рунеті легко знайти інформацію про те, як відтворити з її допомогою звук. Але немає інформації, як отримати аудіодані для подальшої обробки. Тому я напишу, тим більше, що це досить просто.
1 відкриваємо файл
QString name = "D:/qtProg/audioprocessor/test2.mp3"; name.replace("/","\\"); SampleSourcePtr source; source = OpenSampleSource( name.toLocal8Bit() ); if(!source) { ui->statusBar->showMessage("файл не открыт"); return; } else { ui->statusBar->showMessage(name); }
2 зчитуємо параметри аудіосигналу
int ccount; // число каналов int samplerate; // частота дискретизации SampleFormat format; // формат данных source->getFormat(ccount, samplerate, format); int l = source->getLength(); // число отсчётов одного канала
Для типових аудіозаписів число каналів дорівнює двом, досить часто зустрічається одноканальні записи, інші мені не доводилося зустрічати, але працювати повинно за тим же принципом. Зверніть увагу, що кількість відрахунків, отримана за допомогою getLength(), відповідає одному каналу. Частота дискретизації (якщо ви не знаєте, що це таке – ознайомтеся з теоремою Котельникова або теоремою Найквіста). Формат визначає число біт, яким кодується один відлік (зазвичай 16).
3 створюємо буфер і відповідне сховище
int w = 256; // размер временного окна qint16 buf[w*ccount]; QVector<qint16> data; // хранилище данных для одного канала
4 зчитуємо дані
int row = l/w; // число временных фрагментов for(int j = 0; j < row; j++) { source->read(w, buf); // считывание фрагмента for(int i=0; i<w; i++) { data.append(buf[i*ccount]); } } source->read(w, buf); // считывание последнего фрагмента for(int i=0; i < l%w; i++) { data.append(buf[i*ccount]); }
Тепер вилучені дані можна обробляти.
Текст програми можна завантажити
тут
Добрый день, Дмитрий.
Спасибо за статью. Единственный момент, пожалуйста, поместите статью под кат, то есть отделите большую часть статьи разделителем контента, это одна из кнопок в тулбаре редактора. Она отделяет превью статьи в ленте от остальной части контента.
Ещё раз спасибо.