用python写一段代码,播放wav格式的音频,python环境为3.8版本
时间: 2024-03-14 17:45:16 浏览: 185
可以使用Python自带的wave模块来实现,代码示例如下:
```python
import wave
import pyaudio
# 打开wav文件
wav_file = wave.open("audio.wav", "rb")
# 创建PyAudio对象
p = pyaudio.PyAudio()
# 打开音频流
stream = p.open(format=p.get_format_from_width(wav_file.getsampwidth()),
channels=wav_file.getnchannels(),
rate=wav_file.getframerate(),
output=True)
# 读取数据并播放
data = wav_file.readframes(1024)
while data:
stream.write(data)
data = wav_file.readframes(1024)
# 关闭流和 PyAudio
stream.stop_stream()
stream.close()
p.terminate()
```
以上代码中,我们使用wave模块打开wav文件,然后使用PyAudio创建一个音频流,并将音频流的格式、通道数、采样率设置为wav文件的格式。最后,读取数据并写入音频流中,实现播放音频的操作。
相关问题
用python生成显示wav文件波形和增加可以在时间轴裁剪波形和保存波形文件的PYQT程序
以下是一个可以生成显示wav文件波形、裁剪波形和保存波形文件的PYQT程序的示例代码:
```python
import sys
import wave
import numpy as np
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import Qt
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 设置窗口标题、大小、图标
self.setWindowTitle('Waveform Viewer')
self.setGeometry(100, 100, 800, 500)
self.setWindowIcon(QIcon('icon.png'))
# 添加控件
self.label = QLabel(self)
self.label.setGeometry(10, 10, 780, 400)
self.btn_open = QPushButton('Open', self)
self.btn_open.setGeometry(10, 420, 80, 30)
self.btn_open.clicked.connect(self.open_file)
self.btn_save = QPushButton('Save', self)
self.btn_save.setGeometry(100, 420, 80, 30)
self.btn_save.clicked.connect(self.save_file)
self.slider_start = QSlider(Qt.Horizontal, self)
self.slider_start.setGeometry(190, 420, 400, 30)
self.slider_start.setMinimum(0)
self.slider_start.setMaximum(100)
self.slider_start.setSingleStep(1)
self.slider_start.setValue(0)
self.slider_start.sliderReleased.connect(self.update_waveform)
self.slider_end = QSlider(Qt.Horizontal, self)
self.slider_end.setGeometry(190, 450, 400, 30)
self.slider_end.setMinimum(0)
self.slider_end.setMaximum(100)
self.slider_end.setSingleStep(1)
self.slider_end.setValue(100)
self.slider_end.sliderReleased.connect(self.update_waveform)
def open_file(self):
# 打开wav文件
filename, _ = QFileDialog.getOpenFileName(self, 'Open file', '.', 'Waveform files (*.wav)')
if filename:
self.filename = filename
self.update_waveform()
def update_waveform(self):
# 生成波形
with wave.open(self.filename, 'rb') as wf:
framerate = wf.getframerate()
nframes = wf.getnframes()
data = wf.readframes(nframes)
frames = np.frombuffer(data, dtype=np.int16)
times = np.arange(len(frames)) / framerate
start = int(self.slider_start.value() / 100 * len(frames))
end = int(self.slider_end.value() / 100 * len(frames))
frames = frames[start:end]
times = times[start:end]
# 显示波形
fig, ax = plt.subplots(figsize=(7.8, 3.8))
ax.plot(times, frames)
ax.set_xlabel('Time (s)')
ax.set_ylabel('Amplitude')
ax.set_xlim([times[0], times[-1]])
ax.set_ylim([-32768, 32767])
plt.tight_layout()
plt.savefig('waveform.png')
pixmap = QPixmap('waveform.png')
self.label.setPixmap(pixmap)
def save_file(self):
# 保存裁剪后的wav文件
filename, _ = QFileDialog.getSaveFileName(self, 'Save file', '.', 'Waveform files (*.wav)')
if filename:
with wave.open(filename, 'wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(44100)
with wave.open(self.filename, 'rb') as wf_src:
nframes = wf_src.getnframes()
start = int(self.slider_start.value() / 100 * nframes)
end = int(self.slider_end.value() / 100 * nframes)
wf.setnframes(end - start)
wf.writeframes(wf_src.readframes(end - start))
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
```
在上述代码中,我们首先导入了必要的模块,包括`sys`、`wave`、`numpy`、`matplotlib.pyplot`、`PyQt5.QtWidgets`、`PyQt5.QtGui`和`PyQt5.QtCore`,然后定义了一个名为`MainWindow`的类,继承自`QMainWindow`。在`MainWindow`类中,我们定义了一些控件,包括一个用于显示波形的`QLabel`、两个用于裁剪波形的`QSlider`、一个用于打开wav文件的`QPushButton`、一个用于保存裁剪后的wav文件的`QPushButton`。在`initUI`方法中,我们进行了控件的初始化和布局。在`open_file`方法中,我们使用`QFileDialog`打开一个wav文件,并保存文件名。在`update_waveform`方法中,我们读取wav文件的采样率、采样点数和采样数据,然后根据用户在`QSlider`上的选择裁剪波形。接着,我们使用matplotlib绘制波形图,并将图像保存为文件,最后使用`QPixmap`将波形图显示在`QLabel`上。在`save_file`方法中,我们使用`QFileDialog`打开一个用于保存裁剪后的wav文件的对话框,并使用`wave`模块保存裁剪后的wav文件。在主程序中,我们创建了一个`QApplication`对象和一个`MainWindow`对象,并将`MainWindow`显示出来。
阅读全文