用python生成显示wav文件波形和可以在时间轴裁剪波形后保存波形文件的PYQT程序
时间: 2024-05-16 10:12:52 浏览: 84
以下是一个简单的PYQT程序,可以生成并显示wav文件的波形,并允许用户在时间轴上裁剪波形后保存波形文件。
```python
import sys
import wave
import numpy as np
import matplotlib.pyplot as plt
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QSlider, QFileDialog
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(100, 100, 800, 600)
self.setWindowTitle('Waveform Viewer')
self.file_label = QLabel(self)
self.file_label.setGeometry(20, 20, 300, 20)
self.file_label.setText('No file loaded.')
self.load_button = QPushButton(self)
self.load_button.setGeometry(20, 50, 100, 30)
self.load_button.setText('Load File')
self.load_button.clicked.connect(self.load_file)
self.play_button = QPushButton(self)
self.play_button.setGeometry(20, 100, 100, 30)
self.play_button.setText('Play')
self.play_button.clicked.connect(self.play_file)
self.trim_slider = QSlider(self)
self.trim_slider.setGeometry(20, 150, 760, 20)
self.trim_slider.setOrientation(Qt.Horizontal)
self.trim_slider.setEnabled(False)
self.trim_slider.sliderMoved.connect(self.update_trim)
self.trim_start_label = QLabel(self)
self.trim_start_label.setGeometry(20, 180, 100, 20)
self.trim_start_label.setText('Trim Start: 0.0s')
self.trim_end_label = QLabel(self)
self.trim_end_label.setGeometry(680, 180, 100, 20)
self.trim_end_label.setText('Trim End: 0.0s')
self.save_button = QPushButton(self)
self.save_button.setGeometry(20, 210, 100, 30)
self.save_button.setText('Save File')
self.save_button.setEnabled(False)
self.save_button.clicked.connect(self.save_file)
self.show()
def load_file(self):
filename, _ = QFileDialog.getOpenFileName(self, 'Open File', '.', 'Wave Files (*.wav)')
if filename:
self.wav_file = wave.open(filename, 'rb')
self.file_label.setText('File: ' + filename)
self.play_button.setEnabled(True)
self.trim_slider.setEnabled(True)
self.save_button.setEnabled(True)
self.trim_slider.setMaximum(self.wav_file.getnframes())
self.trim_end_label.setText('Trim End: {:.1f}s'.format(self.wav_file.getnframes() / self.wav_file.getframerate()))
def play_file(self):
self.wav_file.rewind()
data = self.wav_file.readframes(1024)
while data:
data = self.wav_file.readframes(1024)
def update_trim(self):
start_sample = self.trim_slider.value()
end_sample = self.wav_file.getnframes()
self.trim_start_label.setText('Trim Start: {:.1f}s'.format(start_sample / self.wav_file.getframerate()))
self.trim_end_label.setText('Trim End: {:.1f}s'.format(end_sample / self.wav_file.getframerate()))
def save_file(self):
filename, _ = QFileDialog.getSaveFileName(self, 'Save File', '.', 'Wave Files (*.wav)')
if filename:
start_sample = self.trim_slider.value()
end_sample = self.wav_file.getnframes()
self.wav_file.setpos(start_sample)
data = self.wav_file.readframes(end_sample - start_sample)
with wave.open(filename, 'wb') as f:
f.setnchannels(self.wav_file.getnchannels())
f.setsampwidth(self.wav_file.getsampwidth())
f.setframerate(self.wav_file.getframerate())
f.writeframes(data)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
```
该程序使用PyQt5进行GUI界面的设计,使用wave和numpy库来处理wav文件,使用matplotlib库来生成波形图。程序分为四个部分:
1. 初始化UI界面。
2. 加载wav文件,并显示文件信息。
3. 播放wav文件。
4. 保存裁剪后的wav文件。
用户可以通过点击“Load File”按钮来加载wav文件,通过点击“Play”按钮来播放wav文件。用户可以使用滑动条来裁剪wav文件,并通过点击“Save File”按钮来保存裁剪后的wav文件。
阅读全文