之前有个项目需要将音频文件的频谱显示出来,想了很多办法,后面发现fmod这个好东西,还是跨平台的,就一个头文件+一个库文件就行,简单小巧功能强大,人家做的真牛逼。为了不卡住界面,采用了多线程处理。
可执行文件下载:https://pan.baidu.com/s/1JIjiCv800KPDZS9aSRPObQ
1:可获取整个声音文件采样值数据
2:可实时获取当前播放位置的采样值数据
3:可设置采样的步长和数量
4:可开始播放/暂停播放/停止播放
5:多线程处理,超流畅
6:可设置当前播放位置
7:可设置音量
#ifndef FMODTHREAD_H #define FMODTHREAD_H /** * fmod音乐播放类 作者:feiyangqingyun(QQ:517216493) 2017-9-12 * 1:可获取整个声音文件采样值数据 * 2:可实时获取当前播放位置的采样值数据 * 3:可设置采样的步长和数量 * 4:可开始播放/暂停播放/停止播放 * 5:多线程处理,超流畅 * 6:可设置当前播放位置 * 7:可设置音量 * 参考文章:http://blog.csdn.net/fengyhack/article/details/43318575 */ #include <QThread> class FMOD_SYSTEM; class FMOD_SOUND; class FMOD_CHANNEL; class FmodThread : public QThread { Q_OBJECT public: explicit FmodThread(QObject *parent = 0); ~FmodThread(); protected: void run(); private: bool stopped; //停止线程标志位 bool isPlayWave; //开始播放标志位 bool isPauseWave; //暂停播放标志位 bool isStopWave; //停止播放标志位 bool isReadWave; //读取当前位置采样值标志位 int step; //采样值步长 int count; //采样点总数 int interval; //采样间隔 bool showWaveDataAll; //是否显示总采样 QString fileName; //当前声音文件 FMOD_SYSTEM *system; //fmod结构体 FMOD_SOUND *sound; //播放声音对象 FMOD_CHANNEL *channel; //播放声音通道 private slots: //获取当前位置采样值数据 void readWaveData(); //获取所有采样值数据 void readWaveDataAll(); //开始播放 void playWave(); //暂停播放 void pauseWave(); //停止播放 void stopWave(); signals: //开始播放信号 void playStart(); //停止播放信号 void playStop(); //暂停播放信号 void playPause(); //当前播放时长 void filePositionReceive(uint position, bool isPlay); //总时长 void fileLengthReceive(uint length); //音量大小 void fileVolumeReceive(int volume, bool mute); //当前声音正在播放位置采样值数据 void waveDataReceive(const QVector<float> &waveData); //当前声音所有采样值数据 void waveDataAllReceive(const QVector<float> &waveData); public slots: //设置采样值步长 void setStep(int step); //设置采样点总数 void setCount(int count); //设置采样间隔 void setInterval(int interval); //设置是否显示总采样 void setShowWaveDataAll(bool showWaveDataAll); //设置要播放的声音文件 void setFileName(const QString &fileName); //播放 void play(); //暂停 void pause(); //停止 void stop(); //停止线程 void stopAll(); //设置播放进度位置 void setPosition(int position); //设置音量 void setVolume(int volume); //设置静音 void setMute(bool mute); }; #endif // FMODTHREAD_H