C ++ & MP3 эквалайзер вопрос - PullRequest
2 голосов
/ 15 ноября 2009

Мне нужна библиотека или какая-то команда, которая принимает местоположение файла MP3 в качестве входного (только MP3, мне не нужен WAV, OGG или любой другой тип), воспроизводит файл до конца и делает какой-то эквалайзер, но только в частотах, таких как числа (31HZ, 62HZ, ..., 16 KHZ), все 10 доступных диапазонов, но покажите их мне, как когда-либо изменяющие 10 переменных ... то есть, диапазон 31 HZ похож на (1, 30, 24, 5, 31, ... и т. Д.), И это относится к каждой группе ... но это не обязательно должно быть 1 - 31. Я имею в виду, что это может быть что угодно, кроме идеи, которую я пытаюсь скажем, иметь значение каждой полосы в цифрах и отделить ее от других полос ...

Та же идея, что и для эквалайзера, но не совсем .. Так можно ли это сделать? Есть ли что-нибудь, что может сделать это или помочь в этом?

приписка
- Я не делаю эквалайзер.
- Я все еще своего рода NOOB для C ++, так что будьте спокойны и не говорите: «Вы дурак, это командная строка, которая делает это в C ++ правильной» .. Большое спасибо:)

Ответы [ 2 ]

2 голосов
/ 15 ноября 2009

SoX (обмен звуком) может дать вам частотный анализ аудиофайла во время его воспроизведения. Команда

sox myfile.mp3 temp.wav stat --freq

будет декодировать файл MP3 в файл WAV; в то время как он делает это, он выполняет преобразование Фурье с 4096 точками для каждого блока аудио и печатает пары частота-мощность, как это, в stderr:

0.000000  3.079278
10.766602  5.994057
<snip>
22028.466797  14.589799
22039.233398  14.289429
0.000000  0.232025
<snip>

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

Кроме того, вы можете начать с MP3-декодера с открытым исходным кодом (например, MAD ) и изменить его для проведения необходимого анализа. Декодирование MP3 можно разделить на два этапа:

  • восстановление частотного спектра из кодированного потока битов
  • преобразование частотного спектра в аудиовыход

Для вашего анализа вам нужно сделать только первый этап, а затем сложить спектральную мощность в каждой из полос вашего эквалайзера. Таким образом, этот метод потребует гораздо меньше обработки, чем использование SoX (который завершит декодирование, затем преобразует обратно в частотную область), но привязывает вас только к MP3 (что, как вы говорите, не проблема).

0 голосов
/ 18 декабря 2011

Если вы считаете себя новичком в C ++, я бы порекомендовал вам использовать библиотеку Qt Phonon. Я создал простую демку, смотрите комментарии в коде:

#include <QtCore/QCoreApplication>
#include <phonon>
#include <iostream>

using namespace Phonon;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Phonon::AudioOutput m_AudioOutput(Phonon::MusicCategory);

    // Create Phonon music player
    MediaObject *music = createPlayer(MusicCategory,MediaSource("path_to_audio_file.mp3"));

    // Get list of included Fxs and print it to the stdout
    QList<EffectDescription> fxs = Phonon::BackendCapabilities::availableAudioEffects();

    for(QList<EffectDescription>::iterator i = fxs.begin(); i != fxs.end(); i++)
    {
        std::cout<<std::string(i->name().toUtf8())<<std::endl;
    }

    // Creates a new Path connecting the two MediaNodes - source and sink
    Phonon::Path path = Phonon::createPath(music, &m_AudioOutput);

    if(path.isValid ())
    {
        // Create parametric EQ
        Phonon::Effect *effect = new Phonon::Effect(fxs.at(0));
        path.insertEffect(effect);

        // Get list of fx parameters
        QList<Phonon::EffectParameter> pars = effect->parameters();

        // Do some changes with parameters - set frq. bands as you need

        effect->setParameterValue(pars.at(0), 600); // Center frequency in Hz
        effect->setParameterValue(pars.at(1), 12);  // Bandwidth in Hz at -3dB
        effect->setParameterValue(pars.at(2), -12); // Gain in dB

        // Play audio file effected by the inserted Audio Fx
        music->play();
    }

    return a.exec();
}

Если вы не знакомы с параметрами параметрического эквалайзера, посмотрите эту ссылку:

http://www.astralsound.com/parametric_eq.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...