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

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

Библиотека 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
Looking for a Job?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

DSh
Sept. 21, 2019, 2:55 p.m.
Dmitrij Shilkov

C++ - Test 001. The first program and data types

  • Result:46points,
  • Rating points-6
s
Sept. 18, 2019, 5:19 p.m.
sanyalitv

C++ - Test 002. Constants

  • Result:33points,
  • Rating points-10
s
Sept. 18, 2019, 5:12 p.m.
sanyalitv

C++ - Test 001. The first program and data types

  • Result:80points,
  • Rating points4
Last comments
M
Sept. 20, 2019, 11:25 a.m.
Mark

вызываю метод get у m_downloader в другом методе и приложение начинает вылетать. В чем ошибка?
M
Sept. 19, 2019, 5:45 a.m.
Mark

А вот как выгрузить файл на сервер по http протоколу? Допустим на regRu. И как получить путь файла, которой отображается в файловом менеджере regRu, чтобы загрузить его.
Sept. 17, 2019, 6:07 a.m.
Misha Lebedev

Кстати интересные темы нашёл тут https://emacsway.github.io/ru/django-framework/#django-models Может что полезного тоже Евгений найдёте
Sept. 17, 2019, 4:50 a.m.
Misha Lebedev

Доброго времени суток. Спасибо за хороший ответ, У меня ситуация така что в галлереи будет несколько миллионов фотографий с фильтрами и тегами , и я опасаюсь за производительност . Это ос…
Sept. 17, 2019, 3:23 a.m.
Evgenij Legotskoj

Добрый день. Да, я тоже читал ту статью в своё время и согласен с тем, что внешние ключи гораздо лучше, чем GenericForeignKey. Выборки в ряде случае работают быстрее. Но лично мне про…
Now discuss on the forum
M
Sept. 22, 2019, 1:54 a.m.
Mark

Пока реализовал так: на сервере лежат сами файлы и файл с именами всех файлов и их версий, который админ обновляет при довавлении файла. Клиентское по парсит этот файл и таким образом понимает к…
MS
Sept. 21, 2019, 12:51 p.m.
Mihail Sermjazhko

Так работает import QtQuick 2.7import QtQuick.Window 2.2import QtQuick.Controls 2.0Window { id: demo width: 800 height: 600 visible: true color: "#ff303030" prope…
MS
Sept. 21, 2019, 11:46 a.m.
Mihail Sermjazhko

Говорят через делегат должно работать: ListView{ id:l anchors.fill: parent model: ["data 1","data 2","data 3"] currentIndex : 2 delegate: Text { Rectangle{ …
C
Sept. 21, 2019, 9:08 a.m.
Cobra91151

Здравствуйте! Я хочу подключатся к сетям WiFi Enterprise через свою программу. Настроил Radius Server, поключение к сети через Windows работает. Но при подключении через программу пишет: о…
Sept. 20, 2019, 4:56 a.m.
Pavel K.

Привет , подскажите кто-нибудь , как сделать драг н дроп , не нарушая при этом логику работы зума? import QtQuick 2.6 import QtGraphicalEffects 1.0 Page { id:win property string fi…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB