Qt编写带频谱的音乐播放器

之前有个项目需要将音频文件的频谱显示出来,想了很多办法,后面发现fmod这个好东西,还是跨平台的,就一个头文件+一个库文件就行,简单小巧功能强大,人家做的真牛逼。为了不卡住界面,采用了多线程处理。

执行文件下载:https://pan.baidu.com/s/1JIjiCv800KPDZS9aSRPObQ 

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#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
posted @   飞扬青云  阅读(1377)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示