在做多媒体开发中我们经常需要做pcm(频谱)显示,这个例子专门使用libzplay库实现音频频谱动态显示,附加波动动画。看一下频谱的效果!


实现步骤:
首先我们需要去libzplay下载这个库,因为我使用了它来采集音频频谱数据。
然后配置pro文件

配置好了就开始写功能实现部分,直接上代码吧!

我写了一个专门读取音频数据的类:

AudioData.h

#ifndef AUDIODATA_H
#define AUDIODATA_H#include <QObject>
//#include <QAudioDecoder>
//#include <QAudioBuffer>
#include <QDebug>
//#include <QAudioDecoderControl>
#include <QFile>
#include "libzplay.h"
#include <QTimer>#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
using namespace libZPlay;class AudioData : public QObject
{Q_OBJECT
public:explicit AudioData(QObject *parent = 0);Q_INVOKABLE void setSource(QString source);Q_INVOKABLE void playMusic();Q_INVOKABLE void stopMusic();Q_INVOKABLE void pauseMusic();Q_INVOKABLE void seekPosition(int ms);Q_PROPERTY(int amplitude READ amplitude NOTIFY amplitudeChanged)Q_PROPERTY(int position READ position NOTIFY positionChanged)Q_PROPERTY(bool isPlaying READ isPlaying NOTIFY isPlayingChanged)//music pcm dataQ_PROPERTY(QString pcmData READ pcmData NOTIFY pcmDataChanged)QString pcmData(){QJsonObject root;QJsonArray hn;for(int i =0;i<257;i++){hn.append (pnLeftAmplitude[i]);}root.insert ("data",hn);QJsonDocument doc;doc.setObject (root);return doc.toJson ();}signals:void amplitudeChanged();void positionChanged();void isPlayingChanged();void pcmDataChanged();public slots:void refreshDatas();
private:ZPlay *player;QTimer timer;int  pnHarmonicNumber[512];int  pnHarmonicFreq[257];int  pnLeftAmplitude[257];int  pnRightAmplitude[257];int  pnLeftPhase[257];int  pnRightPhase[257];int mposition=0;bool isMusicPlaying;int amplitude(){return pnRightAmplitude[171];}int position(){return mposition;}bool isPlaying(){return isMusicPlaying;}
};
#endif // AUDIODATA_H

AudioData.cpp

#include "audiodata.h"#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <QImage>AudioData::AudioData(QObject *parent) : QObject(parent)
{player=CreateZPlay();// set graph type to AREA, left channel on topplayer->SetFFTGraphParam(gpGraphType, gtAreaLeftOnTop);// set linear scaleplayer->SetFFTGraphParam(gpHorizontalScale, gsLinear);timer.setInterval(1);connect(&timer,SIGNAL(timeout()),this,SLOT(refreshDatas()));}
//music source
void AudioData::setSource(QString source){const char* msource=source.toLatin1().data();// open fileint result = player->OpenFile(msource, sfAutodetect);if(result == 0){// display error messageqDebug()<<"file open failed"<<player->GetError()<<endl;return;}}/*** @brief AudioData::playMusic*/
void AudioData::playMusic(){player->Play();timer.start();isMusicPlaying=true;isPlayingChanged();
}
/*** @brief AudioData::stopMusic*/
void AudioData::stopMusic(){player->Stop();timer.stop();isMusicPlaying=false;isPlayingChanged();
}
/*** @brief AudioData::pauseMusic*/
void AudioData::pauseMusic(){player->Pause();timer.stop();isMusicPlaying=false;isPlayingChanged();
}
/*** @brief AudioData::refreshDatas*/
void AudioData::refreshDatas(){// get song lengthTStreamInfo info;player->GetStreamInfo(&info);// check key pressif(kbhit()){int a = getch();if(a == 'p' || a == 'P')player->Pause();else if(a=='q'||a=='Q'){player->Stop();}}// get stream status to check if song is still playingTStreamStatus status;player->GetStatus(&status);if(status.fPlay == 0)return;// get current positionTStreamTime pos;player->GetPosition(&pos);this->mposition=pos.ms;positionChanged();int FFTPoints = player->GetFFTGraphParam(gpFFTPoints);player->GetFFTData(FFTPoints,fwTriangular,pnHarmonicNumber,pnHarmonicFreq,pnLeftAmplitude,pnRightAmplitude,pnLeftPhase,pnRightPhase);amplitudeChanged();pcmDataChanged();// draw FFT graph on desktop window//    player->DrawFFTGraphOnHWND(0, 0, 0, 300, 200);//    qDebug()<<pnLeftAmplitude[100]<<endl;}
/*** @brief AudioData::seekPosition* @param ms*/
void AudioData::seekPosition(int ms){TStreamTime time;time.ms=ms;player->Seek(tfMillisecond,&time,smFromBeginning);
}

main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <audiodata.h>
#include <QtQml>int main(int argc, char *argv[])
{QApplication app(argc, argv);QQmlApplicationEngine engine;AudioData ad;engine.rootContext()->setContextProperty("AudioData",&ad);engine.load(QUrl(QStringLiteral("qrc:/main.qml")));return app.exec();
}

main.qml

import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Dialogs 1.2ApplicationWindow {visible: truewidth: 640height: 480title: qsTr("Hello World")property url soundUrl;
//    property var pcmDataM:new Array();property var pcmDatastr:AudioData.pcmDataListModel{id:dataModel}onPcmDatastrChanged: {try{if(dataModel.count===0)return;var jdata=JSON.parse(pcmDatastr).data;for(var a=0;a<jdata.length;a++){dataModel.setProperty(a,"pcmdata",jdata[a]);}}catch(e){console.log(e);}}id:mainwinComponent.onCompleted: {for(var a=0;a<257;a++){dataModel.append({"pcmdata":0});}}menuBar: MenuBar {Menu {title: qsTr("文件")MenuItem {text: qsTr("&打开MP3文件")onTriggered: {mdialog.open();}}}}FileDialog{id:mdialogfolder: shortcuts.homenameFilters: [ "Sound files (*.mp3)" ]onAccepted:{soundUrl=mdialog.fileUrl;AudioData.setSource(soundUrl.toString().substring(8,soundUrl.toString().length));AudioData.playMusic();}}Row{anchors.bottom: parent.bottomanchors.horizontalCenter: parent.horizontalCenterRepeater{model: dataModeldelegate: Rectangle{width: mainwin.width/dataModel.countheight: pcmdata*mainwin.height/255color:Qt.rgba(index/257,Math.abs(257-index)/257,Math.abs(257-index)/257,1)anchors.bottom: parent.bottom
//                radius: width/2
//                border.width:1
//                border.color:"#ffff12"Rectangle{width:parent.widthheight:1color:"#454545"}Behavior on height{PropertyAnimation{properties: "height"duration: 70}}}}}}

基于libzplay 实现window下音乐频谱动态显示相关推荐

  1. Linux下基于Libmad库的MP3音乐播放器编写

    linux下基于Libmad库的MP3音乐播放器编写 libmad是一个开源mp3解码库,其对mp3解码算法做了很多优化,性能较好,很多播放器如mplayer.xmms等都是使用这个开源库进行解码的: ...

  2. window下基于谷歌api和CUM Sphinx的简单语音识别

    window下基于谷歌api和CUM Sphinx的简单语音识别 工具包准备 基于谷歌api语音识别代码 基于谷歌CMU Sphix语音识别代码 格式转换 播放本地语音 输入文本进行读音 作者福建农林 ...

  3. window下基于vscode编译下载AT32工程备忘录

    前言 大部分32位MCU在MDK平台都可以编译,但是MDK是基于window下.并且MDK在代码提示方面并没有做的有vscode好,并且vscode在linux平台下也能用,所以本人考虑将vscode ...

  4. Arduino音乐频谱

    一. 项目简介 本制作是踩在前人的肩膀上走过来的,在清风duino基于arduino Pro Mimi_语音播放彩灯系统基础上修改过来的,现在把不成熟的制作过程分享给大家,希望对需要的朋友有所帮助. ...

  5. STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)

    前言:之前,笔者设计并制作了一个简单的FFT音乐频谱,并且分享了制作过程.本文是在原来的基础上做了一些修改. 效果演示:https://www.bilibili.com/video/av4791553 ...

  6. 深度学习核心技术精讲100篇(二十九)-基于内容和上下文的音乐推荐

    前言 随着在线音乐商城及流媒体音乐服务的出现,数字音乐分发已经使得音乐触手可及.然而,面对突然出现的海量可收听内容,听众很容易面临信息过载的问题.因此,本次分享的主题音乐推荐系统,将为那些面临海量内容 ...

  7. Unreal3 window下内存管理实现详解

    Unreal3 window下内存管理实现详解 最近组里面同事加入了一个很牛叉的内存管理代码,勾起我对内存管理的强烈欲望,以前也做过内存管理,在没有遇到U3以前看了3,4种算法(C++游戏编程 这本书 ...

  8. weblogic 64位 linux,weblogic在linux和window下的安装

    weblogic在linux和window下的安装 Windows server2008 一直下一步没什么坑 centos6.5 使用rpm安装jdk8 安装jdl rpm -ivh jdk-8u19 ...

  9. html音乐跳动的线,利用CSS3制作跳动音乐频谱跳动效果

    [摘要] CSS3新增很多实用的属性,特别是可以实现动画效果的animation属性,本文通过使用CSS3来实现一个类似于音乐频谱跳动效果. 在一个网站上看到"直播中"的提示标题, ...

最新文章

  1. osc上一位哥们的 php编译参数
  2. 使用Logstash同步MySQL数据库信息到ElasticSearch
  3. Windows下安装及使用NVM
  4. 被阿里带火的数据中台:“大中台、小前台”战略是什么?
  5. c语言入门敲打,C语言基础三(敲打键盘、寻找资料,循环语句)
  6. python官网下载安装-Python2.7.6下载
  7. [转]上海新东方vs新东方,SEO实战
  8. HTML自我介绍表格代码制作
  9. 图片在手机上怎么修改格式?怎么改变图片格式?
  10. 企业网站建设流程步骤,教你快速建网站
  11. 数据仓库DW、ODS、DM概念及其区别
  12. camera调试基础经验分享
  13. 机械革命无法使用U盘启动linux,机械革命u盘启动,详细教您机械革命bios怎么设置u盘启动...
  14. 【MySQL 8.0 OCP 1Z0-908认证考试】 题库精讲--第一讲mysqlbackup
  15. 计算机工程学院文艺例会,西航职院 | 计算机工程学院 2019年度学生会干部第一次例会...
  16. 浅谈oracle树状结构层级查询测试数据
  17. arm linux 内核配置,Linux + ARM驱动开发环境配置(内核配置与编译)
  18. 计算机主板风扇安装,cpu风扇怎么装 cpu风扇安装方法【图文】
  19. iSlide插件安装与使用
  20. Codevs 1038 一元三次方程求解 NOIP 2001(导数 牛顿迭代)

热门文章

  1. 编程的本质探索Nature of Coding
  2. 深入Atlas系列:Web Sevices Access in Atlas示例(6) - 在客户端隐藏服务器端类型信息...
  3. 洛谷P5273 【模板】多项式幂函数 (加强版)
  4. CentOS7.5常用命令整理
  5. JS可以写操作系统?Windows 95被装进Electron App
  6. 据说--------100年前光绪帝在北大的讲话
  7. MySQL学习之二进制日志
  8. OCS 企业版图解详细部署
  9. Http压测工具wrk使用指南【转】
  10. 配置ubuntu - tftp server服务器步骤