用Python-pyqt5制作一个可以打开音频文件,一边播放音频一边同时显示波形和FFT波形两个窗口的,带按键的多线程程序

时间: 2024-05-14 07:12:45 浏览: 15
这是一个基本的Python-pyqt5多线程程序,它可以打开音频文件,一边播放音频一边同时显示波形和FFT波形两个窗口,并带有按键操作。 我们首先需要导入必要的模块和库: ```python import sys import os import wave import struct import numpy as np import matplotlib.pyplot as plt import threading import time from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import Qt, QThread, pyqtSignal from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QMessageBox ``` 接下来,我们需要定义一个Thread类,用于处理音频文件的读取和波形绘制: ```python class WorkerThread(QThread): plot_signal = pyqtSignal(np.ndarray) fft_signal = pyqtSignal(np.ndarray) status_signal = pyqtSignal(str) def __init__(self, filename): super().__init__() self.filename = filename def run(self): wf = wave.open(self.filename, 'rb') # 获取音频文件的参数 channels = wf.getnchannels() sample_width = wf.getsampwidth() framerate = wf.getframerate() nframes = wf.getnframes() # 读取音频数据 data = wf.readframes(nframes) # 将数据转换为numpy数组 data = np.frombuffer(data, dtype='<i2') # 如果是双声道,则转换为左右声道分别存储 if channels == 2: left = data[::2] right = data[1::2] else: left = data right = None # 计算时间轴 time_axis = np.arange(0, nframes) / framerate # 发送绘制波形的信号 self.plot_signal.emit(left) # 计算FFT fft_size = 2 ** int(np.ceil(np.log2(nframes))) freq_axis = np.fft.fftfreq(fft_size, 1 / framerate)[:fft_size // 2] fft_data = np.fft.fft(left, fft_size)[:fft_size // 2] fft_data = np.abs(fft_data) # 发送绘制FFT波形的信号 self.fft_signal.emit(fft_data) # 发送状态信号 self.status_signal.emit('Ready') ``` 我们定义了一个WorkerThread类,它继承自QThread类,并具有三个信号:plot_signal,fft_signal和status_signal。plot_signal和fft_signal将分别在波形和FFT波形窗口中绘制波形和FFT波形,而status_signal将用于在状态栏中显示应用程序的状态。 在run方法中,我们首先打开音频文件并获取其参数。接下来,我们读取音频数据并将其转换为numpy数组。如果音频文件是双声道,则将其转换为左右声道分别存储。然后,我们计算时间轴并发送plot_signal信号以绘制波形。 接下来,我们计算FFT,并发送fft_signal信号以绘制FFT波形。最后,我们发送status_signal信号以显示“Ready”状态。 下一步是创建主窗口并添加必要的控件。我们添加了一个菜单栏、一个状态栏和两个工具栏。菜单栏包含“文件”菜单,状态栏用于显示应用程序的状态,如“Ready”和“Processing”,工具栏包含打开和播放按钮。 ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() # 设置窗口标题和大小 self.setWindowTitle('Audio Player') self.setGeometry(100, 100, 800, 600) # 添加菜单栏 menu_bar = self.menuBar() file_menu = menu_bar.addMenu('文件') # 添加状态栏 status_bar = self.statusBar() status_bar.showMessage('Ready') # 添加工具栏 toolbar = self.addToolBar('工具栏') # 添加打开按钮 open_button = QtWidgets.QAction(QtGui.QIcon('open.png'), '打开', self) open_button.setShortcut('Ctrl+O') open_button.triggered.connect(self.open_file) toolbar.addAction(open_button) # 添加播放按钮 play_button = QtWidgets.QAction(QtGui.QIcon('play.png'), '播放', self) play_button.setShortcut('Ctrl+P') play_button.triggered.connect(self.play_file) toolbar.addAction(play_button) # 添加停止按钮 stop_button = QtWidgets.QAction(QtGui.QIcon('stop.png'), '停止', self) stop_button.setShortcut('Ctrl+S') stop_button.triggered.connect(self.stop_file) toolbar.addAction(stop_button) # 添加分割线 toolbar.addSeparator() # 添加退出按钮 exit_button = QtWidgets.QAction(QtGui.QIcon('exit.png'), '退出', self) exit_button.setShortcut('Ctrl+Q') exit_button.triggered.connect(self.close) toolbar.addAction(exit_button) # 添加波形窗口 self.plot_widget = PlotWidget(self) self.setCentralWidget(self.plot_widget) # 添加FFT波形窗口 self.fft_plot_widget = PlotWidget(self) self.fft_plot_widget.setMaximumHeight(100) self.fft_plot_widget.setMinimumHeight(100) self.addToolBar(Qt.BottomToolBarArea, self.fft_plot_widget) ``` 我们创建了一个MainWindow类,并在其中添加了一个菜单栏、一个状态栏和两个工具栏。我们还添加了一个PlotWidget类,用于绘制波形和FFT波形。波形窗口被设置为中心窗口,而FFT波形窗口被设置为底部工具栏。 下一步是实现打开和播放音频文件的方法: ```python def open_file(self): # 打开文件对话框 filename, _ = QFileDialog.getOpenFileName(self, '打开文件', '.', 'WAV files (*.wav)') # 如果选择了文件,则开始处理 if filename: self.statusBar().showMessage('Processing...') self.thread = WorkerThread(filename) self.thread.plot_signal.connect(self.plot_widget.plot) self.thread.fft_signal.connect(self.fft_plot_widget.plot) self.thread.status_signal.connect(self.statusBar().showMessage) self.thread.start() def play_file(self): if hasattr(self, 'thread'): self.thread.status_signal.emit('Playing...') ``` 我们使用QFileDialog打开文件对话框,让用户选择要打开的文件。如果用户选择了文件,则创建一个WorkerThread对象并连接plot_signal、fft_signal和status_signal信号以更新波形和状态。 当用户点击播放按钮时,我们发送一个“Playing”状态信号。这只是一个演示,实际上我们需要使用第三方库来播放音频文件。 最后,我们实现了停止方法: ```python def stop_file(self): if hasattr(self, 'thread'): self.thread.terminate() self.statusBar().showMessage('Ready') ``` 当用户点击停止按钮时,我们终止WorkerThread线程并将状态栏设置为“Ready”。 完整的代码如下:

相关推荐

最新推荐

recommend-type

grpcio-1.63.0-cp38-cp38-linux_armv7l.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

SQLyog-13.1.3-0.x86Community.exe

SQLyog-13.1.3-0.x86Community
recommend-type

VB自动出题题库系统设计(源代码+系统).rar

计算机专业毕业设计VB精品论文资源
recommend-type

debugpy-1.0.0b2-cp35-cp35m-manylinux1_i686.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

实战自学python如何成为大佬(目录):https://blog.csdn.net/weixin-67859959/artic

实战自学python如何成为大佬(目录):https://blog.csdn.net/weixin-67859959/artic
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。