python音频播放库--pyaudio
安装:
方法一:
下载whl文件:https://pypi.org/project/PyAudio/#files
[注意:下载相应的版本]
在CMD中执行:pip install F:\python\PyAudio-0.2.14-cp312-cp312-win32.whl
方法二:
在CMD:python -m pip install pyaudio
播放
import pyaudio #导入库 import wave wave_file = wave.open('D:/驿动的心.wav', 'rb') #打开文件 p = pyaudio.PyAudio() #创建PyAudio对象 stream = p.open(format=p.get_format_from_width(wave_file.getsampwidth()), channels=wave_file.getnchannels(), rate=wave_file.getframerate(), output=True) #打开音频流--设置音频流信息 #get_format_from_width 将参数转化为yaudio.paInt16 #参数format:采样大小和格式,如pyaudio.paInt16表示16位整数 #参数channels:通道数,单声道为1,立体声为2,决定音频的立体声效果 #参数rate: 采样率,如44100Hz,决定音频的音质和播放速度 #参数input:是否输入流 True是,False否 #参数output:是否输出流(用来播放) True是,False否 data = wave_file.readframes(1024) while data != b'': stream.write(data) # 把数据写进流对象--进行播放 data = wave_file.readframes(1024) stream.stop_stream() #停止音频流 #stop后在start_stream()之前不可再read或write stream.close() #关闭这个流对象 p.terminate() # 关闭PyAudio对象
录音
import pyaudio import soundfile as sf import numpy as np import wave i=0 frames = [] p = pyaudio.PyAudio() # 创建播放器 stream3 = p.open(format=pyaudio.paInt16, channels=2, rate=44100, input=True,frames_per_buffer=1024) # 打开数据流 #采样率*time*通道=采集的数据个数 n=44100*5*2/1024 #5秒钟需要读取的次数 while i<n : data = stream3.read(1024) # 从麦克风读取数据 i=i+1 frames.append(data) # 写入录音文件 wf = wave.open("D:/output.wav", 'wb') wf.setnchannels(2) wf.setsampwidth(2) wf.setframerate(44100) wf.writeframes(b''.join(frames)) wf.close() stream3.close() #关闭这个流对象 p.terminate() # 关闭PyAudio对象
实例
import pyaudio #导入库 import wave #导入wav音频库 import sys from PyQt5.QtWidgets import QApplication, QWidget,QFileDialog from pya import Ui_Form import threading class Win(QWidget,Ui_Form): def __init__(self): super(Win, self).__init__() self.CHUNK = 1024 # 定义数据流块--每次读取数据的字节数 self.FORMAT = pyaudio.paInt16 #16int self.CHANNELS = 2 self.RATE = 44100 self.RECORD_SECONDS = 5 # 录音时间 self.WAVE_OUTPUT_FILENAME = "D:/output.wav" #录音时要写入的文件名 self.p = pyaudio.PyAudio() # 创建播放器 self.data='' self.setupUi(self) def dakaiwenjian(self):#打开文件 self.r = QFileDialog.getOpenFileName(self, '请选择要打开的文件', '.\\', 'WAV(*.wav)', 'WAV(*.wav)') self.lineEdit.setText(self.r[0]) def luyin(self):#录音开始 self.t1 = threading.Thread(target=self.luyin1) # 创建线程 self.t1.setDaemon(True) # 守护线程 self.t1.start() def luyin1(self): self.stream1 = self.p.open(format=self.FORMAT,channels=self.CHANNELS,rate=self.RATE,input=True,frames_per_buffer=self.CHUNK) # 打开数据流 self.frames = [] n=0 while not(self.stream1.is_stopped() ): data = self.stream1.read(self.CHUNK) #从麦克风读取数据 self.frames.append(data) print(data,n) n=n+1 def luyinjiesu(self):#录音结束 self.t2 = threading.Thread(target=self.luyijiesu1) # 创建线程 self.t2.setDaemon(True) # 守护线程 self.t2.start() def luyijiesu1(self): self.stream1.stop_stream() # 停止录音流 self.stream1.close() #关闭录音流 # 写入录音文件 wf = wave.open(self.WAVE_OUTPUT_FILENAME, 'wb') wf.setnchannels(self.CHANNELS) wf.setsampwidth(self.p.get_sample_size(self.FORMAT)) wf.setframerate(self.RATE) wf.writeframes(b''.join(self.frames)) wf.close() def jixu(self): #继续 if self.data != '' and self.stream.is_stopped(): self.stream.start_stream() #继续流 # stream.close()之后就不能继续了 self.bofan() def zantin(self):#暂停 if self.data != '': self.stream.stop_stream() # 停止数据流--暂停 # 一旦流停止,就不能调用写或读 # 指针位置不变 def tinzi(self):#停止 self.stream.stop_stream() self.stream.close() #关闭流 self.data='' #说明:我找不到判断流是否打开的函数,我用self.data=''表示流已经关闭 self.wf.close() def bofan1(self): if self.data=='' and self.lineEdit.text()!='': self.wf = wave.open(self.r[0], 'rb') self.stream = self.p.open(format=self.p.get_format_from_width(self.wf.getsampwidth()), channels=self.wf.getnchannels(), rate=self.wf.getframerate(), output=True) # 打开数据流--【获取音频格式信息】 # output=True 输出的意思 self.data = self.wf.readframes(self.CHUNK) # 读取数据 while (self.data) != '' and not(self.stream.is_stopped() ): #self.stream.is_stopped() 流是否停止,如果停止返回True self.stream.write(self.data) #播放 #注意事项:播放时占用线程,最好创建一个线程 self.data = self.wf.readframes(self.CHUNK) def bofan(self): #播放 self.t = threading.Thread(target=self.bofan1) #创建线程 self.t.setDaemon(True) #守护线程 self.t.start() def qita(self):#其它 #self.p.terminate() #关闭播放器 #print('是否激活:',self.stream.is_active()) # is_active() 判断流是否激活 必须在打开后判断 pass if __name__ == '__main__': app = QApplication(sys.argv) demo = Win() demo.show() sys.exit(app.exec_())
界面浏览:
上面工程下载: https://pan.baidu.com/s/1VAaoIQSpIFaeXTKiVoiuqg&shfl=sharepset 提取码:v2g8