之前有个项目需要将音频文件的频谱显示出来,想了很多办法,后面发现fmod这个好东西,还是跨平台的,就一个头文件+一个库文件就行,简单小巧功能强大,人家做的真牛逼。为了不卡住界面,采用了多线程处理。
开源主页:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
1:可获取整个声音文件采样值数据
2:可实时获取当前播放位置的采样值数据
3:可设置采样的步长和数量
4:可开始播放/暂停播放/停止播放
5:多线程处理,超流畅
6:可设置当前播放位置
7:可设置音量
#ifndef FMODTHREAD_H
#define FMODTHREAD_H
/**
* 1:可获取整个声音文件采样值数据
* 2:可实时获取当前播放位置的采样值数据
* 3:可设置采样的步长和数量
* 4:可开始播放/暂停播放/停止播放
* 5:多线程处理,超流畅
* 6:可设置当前播放位置
* 7:可设置音量
*/
#include
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 &waveData);
//当前声音所有采样值数据
void waveDataAllReceive(const QVector &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