1. 程式人生 > >用pyaudio模組讀寫音訊流

用pyaudio模組讀寫音訊流

python中的pyaudio模組對wave音訊流的讀寫特別簡單方便。

一.模組下載
https://pypi.python.org/pypi/PyAudio
二.自帶文件
http://people.csail.mit.edu/hubert/pyaudio/docs/#
三.解析
通過wave模組從音訊檔案中讀取資料,返回wave類。然後把讀取的str資料通過pyaduio模組寫到聲卡里。
1. wave模組
wf =wave.open(filenanme, mode’)此處讀取音訊檔案,返回instance物件類
對wave類操作如下:
wf.setnchannels(1) 設定音訊檔案的聲道數,用在寫音訊流時
wf.setsampwidth(2) 設定音訊檔案每個取樣值得儲存位數,用在寫音訊流時
wf.setframerate(8000)設定取樣率,用在寫音訊流時
wf.getnchannels() 獲得音訊檔案的聲道數,用在讀音訊流時
wf.getsampwidth() 獲得音訊檔案每個取樣值得儲存位數,用在讀音訊流時
wf.getframerate()獲得取樣率,用在讀音訊流時
2. pyaudio模組
通過p = pyaudio.PyAudio()返回pyaudio類instance,通過此類可以操作聲音輸出輸入
PyAudio類的open函式有許多引數:
rate - 取樣頻率
channels - 聲道數
format - 取樣值的量化格式 (paFloat32, paInt32, paInt24, paInt16, paInt8 …)。在上面的例子中,使用 get_format_from_width方法將wf.sampwidth()的返回值2轉換為paInt16
input - 輸入流標誌,如果為True的話則開啟輸入流
output - 輸出流標誌,如果為True的話則開啟輸出流
input_device_index - 輸入流所使用的裝置的編號,如果不指定的話,則使用系統的預設裝置
output_device_index - 輸出流所使用的裝置的編號,如果不指定的話,則使用系統的預設裝置
frames_per_buffer - 底層的快取的塊的大小,底層的快取由N個同樣大小的塊組成
start - 指定是否立即開啟輸入輸出流,預設值為True

四.播放wave音訊

-*-coding:utf-8-*
import pyaudio,wave

wf = wave.open(r"zhe.wav", 'rb')

p = pyaudio.PyAudio()
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),
                channels = wf.getnchannels(),
                rate = wf.getframerate(),
                output = True)

while
True: data = wf.readframes(1000)#從音訊流中讀取1000個取樣資料,data型別為str.注意對音訊流的讀寫都是字串 if data == "":#判斷是否結束 break stream.write(data)#從wf中讀資料,然後寫到stream中。就是從檔案中讀取資料然後寫到聲卡里 stream.stop_stream()#暫停 stream.close()#關閉 p.terminate()

五.錄製wave

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pyaudio,wave

pa = pyaudio.PyAudio() 
stream = pa.open
(format=pyaudio.paInt16, channels=1, rate=8000, input=True, frames_per_buffer=2000) save_buffer = '' wf = wave.open('haha.wav', 'wb') wf.setnchannels(1) wf.setsampwidth(2) wf.setframerate(8000) try: while True: string_audio_data = stream.read(1000) save_buffer += string_audio_data if len(save_buffer) >= 80000:#取樣8次就儲存 wf.writeframes(save_buffer) break except: wf.close()