0
我正在嘗試流式傳輸.WAV文件,同時剝去其中一個聲道,因此它只能在一個揚聲器上播放,同時還會減小音量。使用PyAudio流式傳輸時修改音量
我使用PyAudio的原因是,我將必須能夠
- 流多文件一次
- 播放聲音了具體的揚聲器(左/右)
- 中斷播放的的聲音文件
並無法找到任何其他允許這些功能的Python庫。
我有以下代碼,從PyAudio的流示例修改。它從一個揚聲器播放WAV文件,但我無法找到以任何方式修改音量的方法。
"""PyAudio Example: Play a wave file."""
import pyaudio
import wave
import sys
CHUNK = 1024
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# open stream (2)
sampwidth = wf.getsampwidth()
stream = p.open(format=p.get_format_from_width(sampwidth),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
# read data
data = bytearray(wf.readframes(CHUNK))
# play stream (3)
while len(data) > 0:
#remove left channel
for i in range(0, len(data)):
if i % (sampwidth*2) < sampwidth:
data[i] = 0
#reduce volume by 50%
for i in range(0, len(data)):
# use magic???
pass
stream.write(bytes(data))
data = wf.readframes(CHUNK)
if len(data) > 0:
data = bytearray(data)
# stop stream (4)
stream.stop_stream()
stream.close()
# close PyAudio (5)
p.terminate()
如果有人能給我任何指針,我將不勝感激。我覺得答案需要更好地理解WAV文件格式化的方式,而不是我目前擁有的格式。我試過data[i] = int(data[i]/2)
和其他類似的簡單算法,但輸出結果只是失真,這說明WAV文件格式並不像我想象的那麼簡單。
你的簡單算術不起作用,因爲'data'是一個'bytearray',並且這些操作沒有被定義(並且它們沒有意義,因爲它只是字節,而不是數字)。你願意使用NumPy嗎?使用NumPy數組可以使這些操作成爲可能。 – Matthias