python音頻播放庫--pyaudio


 

 

 

安裝:

方法一:

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

切換到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_())

界面瀏覽:

 

 上面工程下載:  https://pan.baidu.com/s/1VAaoIQSpIFaeXTKiVoiuqg&shfl=sharepset   提取碼:v2g8

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM