基于QT的类QMediaPlayer、QChart、QAudioProbe音乐播放、音乐波形显示、音乐频谱波形显示

文章展示了一个效果演示,尽管略显简陋且考虑不全,提供了源代码链接(<https://pan.baidu.com/s/16hNJSH9nyWayl7kWuyPKLw?pwd=izmc>,提取码:izmc),供读者阅读和理解,旨在探讨和完善代码实现。
摘要由CSDN通过智能技术生成

效果演示

效果一般略简陋,考虑的不太完全

源代码链接:https://pan.baidu.com/s/16hNJSH9nyWayl7kWuyPKLw?pwd=izmc 
提取码:izmc

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一种可能的实现方式: ```python import pyaudio import numpy as np import sys import threading from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout from PyQt5.QtGui import QPainter, QPen from PyQt5.QtCore import Qt class RecordThread(threading.Thread): def __init__(self): super().__init__() self.chunk_size = 1024 # 每次读取的音频数据块大小 self.sample_rate = 44100 # 采样率 self.pa = pyaudio.PyAudio() self.stream = self.pa.open(format=pyaudio.paInt16, channels=1, rate=self.sample_rate, input=True, frames_per_buffer=self.chunk_size) def run(self): while True: data = self.stream.read(self.chunk_size) data_array = np.frombuffer(data, dtype=np.int16) spectrum = np.abs(np.fft.fft(data_array))[:self.chunk_size // 2] spectrum /= np.max(spectrum) spectrum = spectrum[:256] spectrum_db = 20 * np.log10(spectrum) spectrum_db = np.clip(spectrum_db, -50, 0) spectrum_db += 50 spectrum_db /= 50 spectrum_db = spectrum_db[::-1] # 将处理好的数据传递给UI线程 ui_thread.update_spectrum(spectrum_db) class PlayThread(threading.Thread): def __init__(self): super().__init__() self.chunk_size = 1024 # 每次播放的音频数据块大小 self.sample_rate = 44100 # 采样率 self.pa = pyaudio.PyAudio() self.stream = self.pa.open(format=pyaudio.paInt16, channels=1, rate=self.sample_rate, output=True, frames_per_buffer=self.chunk_size) def run(self): while True: data = np.zeros(self.chunk_size, dtype=np.int16) self.stream.write(data) class UiThread(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('Real-time FFT') self.setGeometry(200, 200, 800, 600) self.widget = QWidget() self.setCentralWidget(self.widget) self.layout = QVBoxLayout() self.widget.setLayout(self.layout) self.spectrum = np.zeros(256) # 初始化频谱数据 self.setMinimumWidth(600) self.setMinimumHeight(400) def paintEvent(self, event): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) painter.setPen(QPen(Qt.blue, 2)) width = self.width() height = self.height() bar_width = width / len(self.spectrum) for i, value in enumerate(self.spectrum): x = i * bar_width y = height * (1 - value) painter.drawLine(x, height, x, y) def update_spectrum(self, spectrum): self.spectrum = spectrum self.update() if __name__ == '__main__': app = QApplication(sys.argv) ui_thread = UiThread() record_thread = RecordThread() play_thread = PlayThread() ui_thread.show() record_thread.start() play_thread.start() sys.exit(app.exec_()) ``` 这个程序中有三个线程: - RecordThread:负责实录音并进行FFT变换,将处理好的频谱数据传递给UI线程。 - PlayThread:负责实播放静音,以保持麦克风始终处于工作状态。 - UiThread:负责显示频谱数据,并在接收到RecordThread传递的数据更新界面。 在主函数中,先创建一个Qt应用程序,然后创建UiThread、RecordThread和PlayThread三个线程,并启动它们。最后进入应用程序的事件循环,等待用户关闭程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值