Открываем mp3-файлы с помощью библиотеки audiere

как открыть mp3-файл, звук, audiere, обработка звука, аудио

Content

Библиотека 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]);
    }

Теперь извлечённые данные можно обрабатывать...
Текст программы можно скачать здесь

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

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

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

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Donate

Hello, Dear Users of EVILEG!!!

If the site helped you, then support the development of the site financially, please.

You can do it by following ways:

Thank you, Evgenii Legotckoi

A
March 29, 2020, 12:14 p.m.
Alexanderv66

C++ - Тест 003. Условия и циклы

  • Result:71points,
  • Rating points1
A
March 29, 2020, 12:05 p.m.
Alexanderv66

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:80points,
  • Rating points4
DE
March 28, 2020, 3:13 p.m.
Denis Erokhin

C++ - Test 005. Structures and Classes

  • Result:100points,
  • Rating points10
Last comments
March 27, 2020, 2:40 p.m.
Evgenij Legotskoj

Добрый день. В конце пятой статьи скачать можете.
March 27, 2020, 2:28 p.m.
mkdir _

Здравствуйте, а можно, пожалуйста, ссылку на целые исходники, если есть?
March 27, 2020, 4:36 a.m.
Evgenij Legotskoj

Скорее всего также, как и для установки всех остальных переменых в CMake, через использование set
March 27, 2020, 2:47 a.m.
Andrej Jankovich

Ошибка с ярлыками в Windows исправлена в версиии 1.4.0.4
March 26, 2020, 1:37 p.m.
Andrej Jankovich

но появятся ярлыки, сейчас поправим
Now discuss on the forum
March 30, 2020, 4:16 a.m.
Evgenij Legotskoj

Попробуйте запустить через плейлист, а не через setMedia. Пример есть в этой статье
March 30, 2020, 3:25 a.m.
Evgenij Legotskoj

Добрый день. Почитайте документацию, в исходниках этой библиотеки есть исходнные классы логгеров. Вам наверняка достаточно только правильно вызвать пару функций, чтобы задать имя файла…
March 30, 2020, 3:17 a.m.
Evgenij Legotskoj

Нет, не нужно ничего умножать, если у вас включена поддержа High DPI в приложении а QML, то достаточно держать в памяти, что все значения задаются в DPI, и просто задаёте значения равные DPI сра…
March 27, 2020, 10 a.m.
Mihailll

Оказывается нужно сделать столбец уникальным ALTER TABLE public.drivers ADD UNIQUE (agregator1_id); Потом так работает INSERT INTO drivers( name_driver, surname, middle_name, agr…
s
March 27, 2020, 8:25 a.m.
shuric

Спасибо за ответы. Скорее всего оставлю на неопределенное время под macOS. Хоть будет полезно другим начинающим разработчикам.
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB