zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    拾遗:『rhel6系列的开、关机脚本』
    拾遗:{rpm、yum及源码方式管理软件包}
    拾遗:sed&vim
    拾遗:Linux 用户及权限管理基础
    『BASH』——Learn BashScript from Daniel Robbins——[003]
    『BASH』——Hadex's brief analysis of "Lookahead and Lookbehind Zero-Length Assertions"
    『BASH』——Learn BashScript from Daniel Robbins——[001-002]
    Modular arithmetic and Montgomery form 实现快速模乘
    __int128使用
    Windows10下安装CentOS7双系统
  • 原文地址:https://www.cnblogs.com/liming19680104/p/10636530.html
Copyright © 2011-2022 走看看