QT实现WAVE波形录音绘制,qml实现显示左右声道波形图,完整教程

介绍:
一、环境说明
1.QT Creator 版本为4.11.1,QT版本为5.14.1
2.软件架构组成:软件逻辑有QT的C++编写,图形界面由描述性脚本qml编写,数据交互由轻型的数据库SQLite完成
3.实现功能:可以实现双通道音频数据分离为左右通道并绘制波形图显示,可以在此基础上轻松拓展实现录音保存,录音回放
4.软件架构:本项目采用前后端分离的逻辑架构,后端采用QT的C++多线程来处理数据逻辑,前端采用qml来处理图形化界面,数据有SQLite数据库处理
5.对此项目评价:本项目为本人为发帖21ic电子技术论坛而开发,历时5天业余时间完成哈哈,本项目最大亮点是使用qml开发图像化界面,很多QT开发项目是用Widgets来开发图形化界面,导致qml开发资源资料少之又少,很难找到自己需求的的demo,之前有做个一下音频项目,特此用qml做了一个音频处理显示的demo,希望大家多多使用qml开发图形化界面。QT官方初期推出qml图形化界面开发,在QT5版本之前,QT的qml开发有很多bug,导致大多数人偏向Widgets开发界面,随着QT5版本的推进及优化,qml的开发已经大大改善,越来越成熟,开发也得心应手,特别是对大型的QT软件多人协同开发图形化界面qml要比Widgets处理图形化界面更加占有优势,推荐大家多多使用qml开发图形界面。发帖经验不足,写的不好或不对的地方欢迎留言批评指导。帖子结尾会一如既往附程序源码,让你看到并直接用到,不做任何保留,希望大家多多指教。               
二、具体讲解
1.软件逻辑块分为5个文件,图形界面处理分为4个qml文件,**显示有一个.ico文件,具体划分如下图:

说明:上图逻辑处理和图形化界面显示可以单独分离逻辑和显示部分移植,不管借用逻辑处理还是显示界面皆可独立出来使用,方便上手,移植到其他项目直接使用

2.源码核心部分解读如下图: 

说明:1>数据库函数文件sqlitefun.cpp,包含了数据库的基本操作。例如查询、添加、删除、和修改数据等,可以直接是用本文件数据库函数进行移植操作,同时也可以自己独立出来自己在其他项目使用,以及封装完成并经过验证。

          2>DataSource.cpp文件为整个逻辑处理界面,里面包含了qml和QT C++的信号槽交互,以及数据库处理,音频格式定义处理,多线程创建以及操作使用等,特别说明多线程操作可以处理多个音频模块数据,音频模块如果过多不加入多线程实测会出现死机问题,如果单个音频可以不使用多线程处理,文件看似简单实则麻雀虽小五脏俱全

          3>qml文件显示部分使用GridView控件来完成的,用代理方式来实现多个模块显示,可以在此基础上,理论无限拓展显示模块(根据你音频设备个数定),具体文件为CreatDevReadDataModel.qml,主要负责模块显示。在此介绍一下GridView控件, GridView 控件是一个二维的网格布局控件,可以用来显示二维数据,例如图像、矩阵、表格等。GridView 控件可以根据设定的行数、列数、单元格大小和间距等属性自动排列子控件,使得子控件可以形成一个二维网格布局,多个点组成可显示波形曲线。

三、实测图如下:

说明:本实物图显示的是两个声道,因为我的音频设备是双声道的,如果是单声道音频设备,可以在qml调用QT C++初始化音频函数里面配置单声道即可,具体函数可参考DataSource.cpp文件里的initAudo函数,同时也可以直接编辑数据库文件AudioSystem_database.db来操作,打开数据文件软件推荐SQLite Expert Professional,方便修改和浏览数据库配置。
四、总结
1.借此机会建议大家多多使用qml开发图形化界面,总结一下qml优点
      简单易学:QML基于JavaScript语言,语法简单易懂,学习成本低。
      声明式语言:QML使用声明式语言描述UI和应用程序逻辑,使代码更易读,易于理解和维护。
      快速开发:QML提供了许多预制的UI组件,可以快速构建用户界面,同时还可以轻松地自定义这些组件。
      跨平台支持:QML运行多个平台(如Windows,Linux,Mac OS等),多开发语言(如C ++,Python等),有较高的灵活性。
      易于集成:QML可与C ++代码无缝集成,可以轻松访问C ++的功能和库。
      高性能:QML使用OpenGL ES进行渲染,有良好的性能和流畅度。QML优化技术,如局部更新和缓存,进一步提高性能。
2.发帖目的希望能够分享自己的知识和信息资料,共同探讨问题和话题,通过论坛上的其他用户发帖提出建议和见解来更加完善项目的不足,更深层次完善优化项目,发帖不易,请多多留言探讨,谢谢!
---------------------
作者:1pwdzsj1
链接:https://bbs.21ic.com/icview-3295558-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个比较复杂的工程,需要涉及到QT QML的3D图形绘制和数学计算。以下是一个简单的示例代码,可以用来实现3D模型的运动和轨迹图绘制: ``` import Qt3D.Core 2.12 import Qt3D.Render 2.12 import Qt3D.Input 2.12 import Qt3D.Extras 2.12 Entity { id: root property real speed: 1 // 模型运动速度 property real timeStep: 0.01 // 时间步长 property int numPoints: 1000 // 轨迹图上的点数 property real pointSize: 0.1 // 轨迹图上的点的大小 // 定义模型和轨迹图的材质 Material { id: material effect: Effect { techniques: Technique { graphicsApiFilter { api: GraphicsApiFilter.OpenGL profile: GraphicsApiFilter.CoreProfile majorVersion: 3 minorVersion: 2 } renderPasses: RenderPass { shaderProgram: ShaderProgram { vertexShaderCode: loadSource("qrc:/vertex.glsl") fragmentShaderCode: loadSource("qrc:/fragment.glsl") } } } } } // 定义模型 Entity { id: model // 模型的网格 Mesh { id: mesh source: "qrc:/model.obj" } // 模型的变换 Transform { id: transform translation: Qt.vector3d(0, 0, 0) // 初始位置 rotation: Qt.vector3d(0, 0, 0) // 初始旋转 scale: Qt.vector3d(1, 1, 1) // 初始缩放 } // 模型的渲染器 RenderableMesh { mesh: mesh material: material primitiveType: RenderableMesh.Triangles } } // 定义轨迹图 Entity { id: trajectory // 轨迹图的网格 Mesh { id: mesh vertexCount: numPoints attribute: VertexAttribute { name: "position" vertexBaseType: VertexAttribute.Float vertexSize: 3 byteOffset: 0 byteStride: 12 divisor: 0 buffer: Buffer { id: buffer type: Buffer.VertexBuffer data: Float32Array(numPoints * 3) } } attribute: VertexAttribute { name: "color" vertexBaseType: VertexAttribute.Float vertexSize: 3 byteOffset: 0 byteStride: 12 divisor: 0 buffer: Buffer { id: buffer type: Buffer.VertexBuffer data: Float32Array(numPoints * 3) } } } // 轨迹图的变换 Transform { id: transform translation: Qt.vector3d(0, 0, 0) // 初始位置 rotation: Qt.vector3d(0, 0, 0) // 初始旋转 scale: Qt.vector3d(1, 1, 1) // 初始缩放 } // 轨迹图的渲染器 RenderableMesh { mesh: mesh material: material primitiveType: RenderableMesh.Points pointSize: pointSize } } // 定义计时器,用于更新模型和轨迹图的位置 Timer { id: timer interval: timeStep * 1000 // 每个时间步长更新一次 running: true repeat: true onTriggered: { // 更新模型位置 model.transform.translation = Qt.vector3d( model.transform.translation.x + speed * timeStep, model.transform.translation.y, model.transform.translation.z ) // 更新轨迹图位置 var position = trajectory.mesh.attributeByIndex(0).buffer.data var color = trajectory.mesh.attributeByIndex(1).buffer.data for (var i = numPoints - 1; i > 0; i--) { position[i*3] = position[(i-1)*3] position[i*3+1] = position[(i-1)*3+1] position[i*3+2] = position[(i-1)*3+2] color[i*3] = color[(i-1)*3] color[i*3+1] = color[(i-1)*3+1] color[i*3+2] = color[(i-1)*3+2] } position[0] = model.transform.translation.x position[1] = model.transform.translation.y position[2] = model.transform.translation.z color[0] = 1 color[1] = 0 color[2] = 0 trajectory.mesh.attributeByIndex(0).buffer.data = position trajectory.mesh.attributeByIndex(1).buffer.data = color } } } ``` 其中,`model`代表3D模型,`trajectory`代表轨迹图。`material`是模型和轨迹图的共用材质,`speed`是模型的运动速度,`timeStep`是时间步长,`numPoints`是轨迹图上的点数,`pointSize`是轨迹图上的点的大小。`timer`是计时器,用于更新模型和轨迹图的位置。 在实际使用中,需要将示例代码中的模型、材质、着色器和计算方法替换为自己的实现。同时,需要将模型的初始位置、旋转和缩放,以及轨迹图的初始位置、旋转和缩放设置为合适的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值