C ++& MP3均衡器问题

时间:2009-11-15 16:22:37

标签: c++ audio mp3

我想要一个库或某种类型的命令,它将MP3文件位置作为输入(只有MP3,我不需要WAV,OGG或任何其他类型)并将文件播放到它的末尾并制作某种均衡器输出,但只有像(31HZ,62HZ,......,16KHZ)这样的数字频率,所有10个频段都可用但是向我展示了改变10个变量......意思就像31 HZ频段一样(1,30,24,5,31 ......等等)这适用于每个乐队...但它不需要是1-31我的意思是它可以是任何东西,但我想要的想法说是以数字和数字来表示每个乐队的价值。将它与其他乐队分开......

与均衡器相同但不完全相同.. 它可以做到吗?是否有任何可以做到这一点或帮助做到这一点?

P.S。
- 我没有制作均衡器 - 我仍然是一种对C ++的NOOB,所以放轻松,不要去“你这个C ++正确的命令行”...非常感谢:)

2 个答案:

答案 0 :(得分:2)

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(你说这不是问题)。

答案 1 :(得分:0)

如果您认为自己是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