文档章节

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

飞扬青云
 飞扬青云
发布于 2018/07/20 12:31
字数 747
阅读 373
收藏 1

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

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

#ifndef FMODTHREAD_H
#define FMODTHREAD_H

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

#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

 

© 著作权归作者所有

飞扬青云
粉丝 54
博文 108
码字总数 219717
作品 0
徐汇
程序员
私信 提问
HTML5 可视化音乐播放器 - HTML5VisualizationPlayer

最近想做一个音乐电台,就做了一款 HTML5 音乐播放器,我把它分享出来,技术需要分享才能得到进步嘛! 该播放器可以根据音乐绘制频谱,所以我叫它可视化音乐播放器,播放器支持谷歌浏览器和火...

PoppinRubo
2017/05/02
2.9K
0
音乐播放器--CleanPlayer

CleanPlayer 是 Baidu 音乐的在线客户端程序,基于 Qt 5.4,支持歌曲搜索、在线播放、歌词解析。 CleanPlayer 是基于 Qt 编写的音乐播放器,界面由 QML 编写,网络和文件由 C++ 实现,能够搜...

1354057778
2015/09/23
1K
0
Kreogist Mu 0.3.168 发布,音乐播放器

Kreogist Mu 是一个使用Qt 5编写的音乐播放器。能够播放FLAC、ALAC、WAV、APE等无损格式以及MP3、WMA、AAC等有损格式。能够解析ID3v1、ID3v2(ID3v2.0, ID3v2.3, ID3v2.4)以及APEv2等格式的...

東條・スペンサー・咲
2014/12/12
1K
5
android获取和展示音乐的频谱

还有一些帖子: https://blog.csdn.net/Qzhongwenze/article/details/52851297 http://blog.sina.com.cn/s/blog_67d95f40010113ec.html https://blog.csdn.net/caryee89/article/details/693......

whoisliang
2018/11/15
285
0
KaOS 2017.11 发布,引入 Elisa 作为默认音乐播放器

KaOS 2017.11 已发布。除了使用最新的 Plasma Desktop(版本 5.11.3)之外,KaOS 2017.11 还引入了 Elisa 作为默认的音乐播放器。此版本将 Elisa 作为默认音乐播放器。KaOS 用户在最近一次调...

局长
2017/11/20
990
3

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
1K
12
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
22
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
17
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
27
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部