Дмитрий
28 лютого 2019 р. 21:14

Відкриваємо mp3-файли за допомогою бібліотеки audiere

Бібліотека audiere дозволяє працювати з аудіофайлами різних форматів (wav, mp3 тощо). Для роботи нам знадобляться файли audiere.h, audiere.lib, audiere.dll. h-файл підключається до коду програми

  1. #include "audiere.h"

lib-файл лінкуємо в .pro

  1. LIBS += audiere.lib

dll тягаємо за програмою.
У рунеті легко знайти інформацію про те, як відтворити з її допомогою звук. Але немає інформації, як отримати аудіодані для подальшої обробки. Тому я напишу, тим більше, що це досить просто.


1 відкриваємо файл

  1. QString name = "D:/qtProg/audioprocessor/test2.mp3";
  2. name.replace("/","\\");
  3. SampleSourcePtr source;
  4. source = OpenSampleSource( name.toLocal8Bit() );
  5. if(!source)
  6. {
  7. ui->statusBar->showMessage("файл не открыт");
  8. return;
  9. }
  10. else
  11. {
  12. ui->statusBar->showMessage(name);
  13. }

2 зчитуємо параметри аудіосигналу

  1. int ccount; // число каналов
  2. int samplerate; // частота дискретизации
  3. SampleFormat format; // формат данных
  4.  
  5. source->getFormat(ccount, samplerate, format);
  6. int l = source->getLength(); // число отсчётов одного канала

Для типових аудіозаписів число каналів дорівнює двом, досить часто зустрічається одноканальні записи, інші мені не доводилося зустрічати, але працювати повинно за тим же принципом. Зверніть увагу, що кількість відрахунків, отримана за допомогою getLength(), відповідає одному каналу. Частота дискретизації (якщо ви не знаєте, що це таке – ознайомтеся з теоремою Котельникова або теоремою Найквіста). Формат визначає число біт, яким кодується один відлік (зазвичай 16).

3 створюємо буфер і відповідне сховище

  1. int w = 256; // размер временного окна
  2. qint16 buf[w*ccount];
  3.  
  4. QVector<qint16> data; // хранилище данных для одного канала

4 зчитуємо дані

  1. int row = l/w; // число временных фрагментов
  2.  
  3. for(int j = 0; j < row; j++)
  4. {
  5. source->read(w, buf); // считывание фрагмента
  6. for(int i=0; i<w; i++)
  7. {
  8. data.append(buf[i*ccount]);
  9. }
  10. }
  11. source->read(w, buf); // считывание последнего фрагмента
  12. for(int i=0; i < l%w; i++)
  13. {
  14. data.append(buf[i*ccount]);
  15. }

Тепер вилучені дані можна обробляти.
Текст програми можна завантажити тут

По статті запитували1питання

2

Вам це подобається? Поділіться в соціальних мережах!

Evgenii Legotckoi
  • 01 березня 2019 р. 02:27
  • (відредаговано)

Добрый день, Дмитрий.

Спасибо за статью. Единственный момент, пожалуйста, поместите статью под кат, то есть отделите большую часть статьи разделителем контента, это одна из кнопок в тулбаре редактора. Она отделяет превью статьи в ленте от остальной части контента.

Ещё раз спасибо.

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…