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


    之前有个项目需要将音频文件的频谱显示出来,想了很多办法,后面发现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
  • 相关阅读:
    UI自动化测试框架Cypress介绍和使用
    uniapp webview引入另一个uniapp打包的h5传值问题
    uniapp文件下载blob问题,uniapp使用webview引入另一个uniapp的h5时h5中的文件下载后blob,无法打开blob文件
    Maven把本地jar 加入jar库
    maven引入依赖问题
    swoole 进程模型
    Mac 风扇呼呼响的解决办法
    git push rejected 问题
    Mac touchbar 的用途
    查看路由表信息
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/9340806.html
Copyright © 2020-2023  润新知