python音频播放库--pyaudio_读取数据

安装:

方法一:

下载whl文件:​​https://github.com/intxcc/pyaudio_portaudio/releases​​ 

python音频播放库--pyaudio_创建线程_02

切换到whl文件目录,直接用pip安装      pip install PyAudio-0.2.11-cp37-cp37m-win_amd64.whl   

方法二:

在CMD:​​python -m pip install 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_())
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.


界面浏览:

python音频播放库--pyaudio_创建线程_03

 上面工程下载:  ​​https://pan.baidu.com/s/1VAaoIQSpIFaeXTKiVoiuqg&shfl=sharepset​​ 

 提取码:v2g8