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

 

 

 

 

posted @ 2019-04-01 15:10  天子骄龙  阅读(6261)  评论(0编辑  收藏  举报