之前有个项目需要将音频文件的频谱显示出来,想了很多办法,后面发现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

最新文章

  1. HTML中&lt;meta&gt;标签如何正确使用
  2. 最近发现docker感觉不错
  3. 小型工厂企业网站究竟该怎么做好SEO优化,从而带来更多订单?
  4. 阶乘 求n!中质因数的个数
  5. 华为OJ平台——放苹果(典型整数划分问题)
  6. Mac下的常用Shell命令
  7. union 和 union all 的区别
  8. CPU进程与线程的关系和区别
  9. BNU OJ 51003 BQG&#39;s Confusing Sequence
  10. Linux安装Nginx以及简单理解
  11. 如何在MQ中实现支持任意延迟的消息?
  12. flask蓝图的简单使用
  13. 20175324 2018-2019-2 《Java程序设计》第5周学习总结
  14. 2018年发表论文阅读:Convolutional Simplex Projection Network for Weakly Supervised Semantic Segmentation
  15. DELL OME监控服务器安装配置
  16. 你应该这么理解TCP的三次握手和四次挥手
  17. saltstack---自动化运维平台
  18. 20165305 苏振龙《Java程序设计》第七周学习总结
  19. web service简述,通俗易懂----转
  20. Use MusicBrainz in iOS(三)查询专辑的完整信息

热门文章

  1. (转)小议TCP的MSS(最大分段)以及MTU
  2. (实用)Ubuntu 、CentOS更换国内源
  3. PHP 开发者该知道的 5 个 Composer 小技巧
  4. Java对象的序列化与反序列化-Json篇
  5. df命令/du命令/磁盘分区
  6. 用shell 实现对MySQL数据库分页
  7. 图像添加到ABBYY 文档有什么方法
  8. 对象克隆技术Object.clone()
  9. 8 -- 深入使用Spring -- 0...
  10. vuejs监听苹果iphone手机键盘事件