2009-11-15 74 views
2

我想要一個庫或某種以MP3文件位置作爲輸入的命令(只有MP3我不需要WAV,OGG或任何其他類型)並將文件播放到結束並製作某種均衡器輸出,但只能在頻率上像(31HZ,62HZ,...,16 KHZ)這樣的數字,所有可用的10個頻段,但向我展示它們一如既往地改變了10個變量。 31 HZ樂隊就像(1,30,24,5,31 ......等等),並且每個樂隊都適用...但它並不需要是1-31我的意思是它可以是除了想法我想說的是每個樂隊的價值在數字&分開它從其他樂隊...C++&MP3均衡器問題

作爲均衡器,但不完全相同的想法.. 所以可以做?有什麼可以做到或有幫助嗎?

P.S.
- 我沒有製作均衡器。
- 我仍然有種NOOB到C++這樣處之泰然,並沒有走「你這個笨蛋有一個命令行,它在C++中合適的」 ..感謝了很多:)

+2

均衡=譜!分析儀 - 我想你想要後者 – sellibitze 2009-11-15 20:55:21

回答

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綁定(您認爲這不是問題)。

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