python音頻播放庫--pyaudio

 

 

 

安裝:python

方法一:git

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

切換到whl文件目錄,直接用pip安裝      pip install PyAudio-0.2.11-cp37-cp37m-win_amd64.whl   app

方法二:函數

在CMD:python -m pip install pyaudiospa

 

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指針

 

 

 

相關文章
相關標籤/搜索