• 4654阅读
  • 5回复

Qt编写带频谱的音乐播放器 [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2018-07-20
之前有个项目需要将音频文件的频谱显示出来,想了很多办法,后面发现fmod这个好东西,还是跨平台的,就一个头文件+一个库文件就行,简单小巧功能强大,人家做的真牛逼。为了不卡住界面,采用了多线程处理。
执行文件下载https://pan.baidu.com/s/1JIjiCv800KPDZS9aSRPObQ




1:可获取整个声音文件采样值数据
2:可实时获取当前播放位置的采样值数据
3:可设置采样的步长和数量
4:可开始播放/暂停播放/停止播放
5:多线程处理,超流畅
6:可设置当前播放位置
7:可设置音量


头文件代码
  1. #ifndef FMODTHREAD_H
  2. #define FMODTHREAD_H
  3. /**
  4. * fmod音乐播放类 作者:feiyangqingyun(QQ:517216493) 2017-9-12
  5. * 1:可获取整个声音文件采样值数据
  6. * 2:可实时获取当前播放位置的采样值数据
  7. * 3:可设置采样的步长和数量
  8. * 4:可开始播放/暂停播放/停止播放
  9. * 5:多线程处理,超流畅
  10. * 6:可设置当前播放位置
  11. * 7:可设置音量
  12. * 参考文章:http://blog.csdn.net/fengyhack/article/details/43318575
  13. */
  14. #include <QThread>
  15. class FMOD_SYSTEM;
  16. class FMOD_SOUND;
  17. class FMOD_CHANNEL;
  18. class FmodThread : public QThread
  19. {
  20.     Q_OBJECT
  21. public:
  22.     explicit FmodThread(QObject *parent = 0);
  23.     ~FmodThread();
  24. protected:
  25.     void run();
  26. private:
  27.     bool stopped;           //停止线程标志位
  28.     bool isPlayWave;        //开始播放标志位
  29.     bool isPauseWave;       //暂停播放标志位
  30.     bool isStopWave;        //停止播放标志位
  31.     bool isReadWave;        //读取当前位置采样值标志位
  32.     int step;               //采样值步长
  33.     int count;              //采样点总数
  34.     int interval;           //采样间隔
  35.     bool showWaveDataAll;   //是否显示总采样
  36.     QString fileName;       //当前声音文件
  37.     FMOD_SYSTEM *system;    //fmod结构体
  38.     FMOD_SOUND *sound;      //播放声音对象
  39.     FMOD_CHANNEL *channel;  //播放声音通道
  40. private slots:
  41.     //获取当前位置采样值数据
  42.     void readWaveData();
  43.     //获取所有采样值数据
  44.     void readWaveDataAll();
  45.     //开始播放
  46.     void playWave();
  47.     //暂停播放
  48.     void pauseWave();
  49.     //停止播放
  50.     void stopWave();
  51. signals:
  52.     //开始播放信号
  53.     void playStart();
  54.     //停止播放信号
  55.     void playStop();
  56.     //暂停播放信号
  57.     void playPause();
  58.     //当前播放时长
  59.     void filePositionReceive(uint position, bool isPlay);
  60.     //总时长
  61.     void fileLengthReceive(uint length);
  62.     //音量大小
  63.     void fileVolumeReceive(int volume, bool mute);
  64.     //当前声音正在播放位置采样值数据
  65.     void waveDataReceive(const QVector<float> &waveData);
  66.     //当前声音所有采样值数据
  67.     void waveDataAllReceive(const QVector<float> &waveData);
  68. public slots:
  69.     //设置采样值步长
  70.     void setStep(int step);
  71.     //设置采样点总数
  72.     void setCount(int count);
  73.     //设置采样间隔
  74.     void setInterval(int interval);
  75.     //设置是否显示总采样
  76.     void setShowWaveDataAll(bool showWaveDataAll);
  77.     //设置要播放的声音文件
  78.     void setFileName(const QString &fileName);
  79.     //播放
  80.     void play();
  81.     //暂停
  82.     void pause();
  83.     //停止
  84.     void stop();
  85.     //停止线程
  86.     void stopAll();
  87.     //设置播放进度位置
  88.     void setPosition(int position);
  89.     //设置音量
  90.     void setVolume(int volume);
  91.     //设置静音
  92.     void setMute(bool mute);
  93. };
  94. #endif // FMODTHREAD_H

欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350

只看该作者 1楼 发表于: 2018-07-20
又更新
离线往事纯白

只看该作者 2楼 发表于: 2018-07-20
又更新
离线liuchangyin

只看该作者 3楼 发表于: 2018-07-21
离线305750665

只看该作者 4楼 发表于: 2018-07-25
  
雨田哥: 群号:853086607
QQ: 3246214072

刘典武-feiyangqingyun:专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!QQ:517216493
离线核心科技

只看该作者 5楼 发表于: 2018-07-25
刘总,相当6
快速回复
限100 字节
 
上一个 下一个