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 |
分类:
Qt/C++视频监控
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!